【100财富求讲解达人】C语言递归汉诺塔求讲解

main()
{ hanoi(3,'A','B','C'); }

hanoi(n,a,b,c)
int n;
char a,b,c;
{if(n==1) printf("%c=>%c\n",a,c);
else{hanoi(n-1,a,c,b);
printf("%c=>%c\n",a,c);
hannoi(n-1,b,a,c);}
--------------------------------------------------
书上看得不是很明白,请给hannuoi这个函数加上注释,并讲解一下,最好能让我看明白些。

递归法是一种很方便的算法,你不要太过于纠结过程
hannoi这个函数4个变量,分别是要处理的塔的层数n,和塔a,b,c;
a表示原塔,b是目标塔,c是中间的塔;
当n=1时,只有一层,直接移动;
其余情况:先讲上面的(n-1)层塔移到c上,此处可看做原问题的子问题,即hanoi(n-1,a,c,b);
再将最底层移到b,即可。
至于程序,楼上的已经改的很好了, 我就不多说了
不知这样,够明白不?
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-07
首先这个代码有错,已经帮你改了,讲解见注释,不懂可追问
void hanoi(int n, char a, char b, char c)
//将塔座x上按直径由小到大且自上而下编号为1到n的n个圆盘按规则搬到塔座z上
//y可做辅助塔座
{
if(n==1)
printf("%c=>%c\n",a,c); //如果只剩下一个圆盘,就将A塔的直接移动到C塔
else
{
hanoi(n-1,a,c,b); //将A塔上编号为1到n-1的圆盘移到B塔,C塔做辅助塔
printf("%c=>%c\n",a,c); //将编号为n的圆盘从A塔移动到C塔
hanoi(n-1,b,a,c); //将B塔上编号为1到n-1的圆盘移到C塔,A塔做辅助塔
}
}

void main()
{
hanoi(3,'A','B','C'); //这里定义了只有3个圆盘,3个塔座分别为A,B,C
}
第2个回答  2011-10-07
要怎么讲解呀
hanoi(n,a,b,c)
int n;
char a,b,c;
{if(n==1) printf("%c=>%c\n",a,c);//把第一个盘子从a移到c
else{hanoi(n-1,a,c,b);//把n-1个盘子从a移到b
printf("%c=>%c\n",a,c);//第n个盘子从a移到c
hannoi(n-1,b,a,c);}//把n-1个盘子从b移到c
第3个回答  2011-10-07
main()
{ hanoi(3,'A','B','C'); } //

hanoi(n,a,b,c) //把n个金针从A移到C(借助B)
int n;
char a,b,c;
{if(n==1) printf("%c=>%c\n",a,c); //当只有一个金针的时候可以直接从A移到C
else{hanoi(n-1,a,c,b); //把n-1跟金针从a移到b(借助c)
printf("%c=>%c\n",a,c); //把第n跟金针从a移到c
hannoi(n-1,b,a,c);} //把n-1跟金针从b移到c(借助a)

实际上该问题是把n化成两个n-1的问题,不断的递归下去,直到问题的基本实例n=1,然后n=1的就可以解决,接着解决n=2的问题,在解决n=3的问题、、、一直回归到规模为n的问题,最后该问题得到解决!仔细体会递归与回归的问题!
第4个回答  2011-10-07
哥,我很纠结的告诉你,你的程序有点小小的错误:
给你一个我改过的:
#include <stdio.h>
main()
{
hanoi(3,'A','B','C');
getch(); }

int hanoi(n,a,b,c)
int n;
char a,b,c;
{if(n==1)
printf("%c=>%c\n",a,c);
else
{hanoi(n-1,a,c,b);
printf("%c=>%c\n",a,c);
hanoi(n-1,b,a,c);
}
}
首先:你定义的是:hanoi这个函数,所有你程序上上下下,这个hanoi不能打错;你的程序中就有打错了的:
int hanoi(n,a,b,c) /*定义函数hanoi*/
int n;
char a,b,c; /*定义abc类型*/
{if(n==1) /* @*/
printf("%c=>%c\n",a,c); /*如果n==1.就输出 A=>C*/
else 不然
{hanoi(n-1,a,c,b); /*调用hanoi(这里的n变成2了)这个是自己调用自己,不熟悉就那张纸用笔记下n的值,记下输出的值,就好了*/
printf("%c=>%c\n",a,c);
hanoi(n-1,b,a,c);
}
}
第5个回答  2011-10-07
汉诺一就是一个递归调用,多研究下递归过程就ok了。如果满足if条件就停止递归调用,开始返回函数的值,否则进入else继续进行递归调用,一直到你的n等于1.