C++ hanoi塔函数递归问题

2025-04-06 15:12:58
推荐回答(2个)
回答1:

程序就会按照你带的参数去继续调用void hanoi(int n, char one, char two, char three)函数了。这就是调用。以下是我曾经分析过的这个问题。供你参考。附上源程序。

//解决汉诺塔的核心概念:需要将大的在下小的在上的n个盘子从A借助B移动到C,
//全部还是按照大的在下小的在上的原则。
//可以分解为简单的3个过程,以实现递归
//过程0:A的N个盘子借助B移动到C; //move(n,a,b,c); //PS1//备注1
//过程1:A的N-1个盘子借助C移动到B; //move(n-1,a,c,b);
//过程2:A的最后一个盘子直接移动到C //printf("%c->%c\n",a,c); //简化
//过程3:B的N-1个盘子借助A移动到C; //move(n-1,b,a,c);
//过程3实际上回到了假定的过程0 //move(n-1,b,a,c);//和PS1相比:参数AB位置发生变化,n变为n-1
//于是,开始了新一轮的过程1、2、3,并以此实现递归
//本程序关键在于理解递归算法
#include
#include
#include
long count;
void move(int n,char a,char b,char c)
{
if(n==1)
{
printf("\t第%d次移动%c->%c\n",++count,a,c); //当n只有1个的时候直接从a移动到c
}
else
{
move(n-1,a,c,b); //第n-1个要从a通过c移动到b
printf("\t第%d次移动%c->%c\n",++count,a,c); //用于显示移动的每一步//上面一个函数运行后的最后一个盘的移动路线
move(n-1,b,a,c); //n-1个移动过来之后b变开始盘,b通过a移动到c,这边很难理解//
}
}

int main(void)
{
int n;
count=0;
printf("请输入要移动的圆盘数:");
scanf("%d",&n);
move(n,'a','b','c');
printf("%d个圆盘共需移动%d次\n",n,count);
return(0);
}
//本人也新学,供参考

回答2:

用新值重新执行本函数,就像调用其它函数一样