三国回合制过关手游:求C汉诺塔递归详细过程

来源:百度文库 编辑:神马品牌网 时间:2024/04/27 20:06:53
#include "stdio.h"
main()
{void hanoi(int,char,char,char);
int m;
printf("input the number of disks:");
scanf("%d",&m);
printf("The step to moving %d disks:\n",m);
hanoi(m,'A','B','C');
}
void hanoi(int n,char a,char b,char c)
{void move(char,char);
if(n==1) move(a,c);
else
{hanoi(n-1,a,c,b);
move(a,c);
hanoi(n-1,b,a,c);
}
}
void move(char x,char y)
{printf("%c-->%c\n",x,y);
}

如果当m=4的时候,请您详细写出递归的过程,尤其是
hanoi(n-1,a,c,b);
move(a,c);
hanoi(n-1,b,a,c);
这里,我还是不明白是如何递归调用的?这些形参是如何传递的?

解决汉诺塔的基本思想是先把n个盘子除了最下面的盘子以外的所有盘子从第一根柱子(初始柱子)移动到中间那个柱子上(辅助柱子),然后把最下面的盘子移动到最后一根柱子上(目标柱子)。最后把剩下的盘子移动到目标柱子上。这样,然而,完成第一步和第三步也同样是一个移动n-1个盘子的汉诺塔问题。于是,递归调用在这里不可避免。程序你已经写的很清楚,给你解释一下。现把你的程序画上行以便说明。
1 #include "stdio.h"
2 main()
3 {void hanoi(int,char,char,char);
4 int m;
5 printf("input the number of disks:");
6 scanf("%d",&m);
7 printf("The step to moving %d disks:\n",m);
8 hanoi(m,'A','B','C');
9 }
10 void hanoi(int n,char a,char b,char c)
11 {//void move(char,char);
12 if(n==1) move(a,c);
13 else
14 {hanoi(n-1,a,c,b);
15 move(a,c);
16 hanoi(n-1,b,a,c);
17 }
18 }
19 void move(char x,char y)
20 {printf("%c-->%c\n",x,y);
21 }

当m=4时,程序走到第8行,调用函数hanoi(int n,char a,char b,char c)。此时,实参把值传递给了形参,于是此时,n=4,a=A,b=B,c=C。我把第11行的void move(char,char); 注释掉了,应该知道这一句的意思。因为这一行虽然可以让程序更加完整,但是解释的时候加上它会很麻烦。程序走到第12行,因为此时n=4,而不等于1,程序直接走第13行。于是调用第14行的hanoi(n-1,a,c,b)。这是一个递归调用。此时,n=3,a=A,c=B,b=C。要清楚,A,B,C代表的意义。A代表初始柱子,B代表辅助柱子,C代表目标柱子。而a代表第一根柱子,b代表第二根柱子,c代表第三根柱子。这是不一样的。程序继续走,到12行时n依然不等于1。走到14行调用hanoi(n-1,a,c,b)。此时,n=2,a=A,c=C,b=B。程序再走,到12行时n依然不等于1,走到14行调用hanoi(n-1,a,c,b)。此时,n=1,a=A,c=B,b=C。程序走到12行时发现n=1,程序开始走15行。调用move(char x,char y)到20行时输出A-->B。调用结束,回到上一个调用即n=2,a=A,c=C,b=B。程序回到第15行,输出 A-->B。再走第16行,调用hanoi(n-1,b,a,c)。此时n=1,b=A,a=B,c=C。程序回到12行再调用19行输出B-->C。调用结束,回到上一个调用n=3,a=A,c=B,b=C。程序走到15行,输出A-->C,这时,第一根柱子上有一个盘子,第二根柱子上有一个盘子,第三根柱子上有两个盘子。再调用16行就可以完成把第三根柱子里的所有盘子都移动到第二根柱子上。这样。我们就完成了整体目标的第一步。把n个盘子除了最下面的盘子以外的所有盘子从第一根柱子(初始柱子)移动到中间那个柱子上(辅助柱子),调用完成后程序回到15行,此时n=3,a=A,c=B,b=C。15行时输出A-->C,这时便完成了整体目标的第二步,最下面的盘子移动到最后一根柱子上(目标柱子)。再根据程序走到16行,经过跟14行类似的一系列的递归调用,我们就可以完成最终目标了。
我也是现学现卖了,不知道这样说你能不能明白。我感觉光看这么麻烦的字是有点糊涂,但是根据程序看我说的应该可以明白吧,祝你成功了~

找本讲数据结构或算法的书,看一下递归那章。