直升机 横向流效应:c 请教汉诺塔问题,请指点

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/10 23:28:15
if(n==1) move(a,c);
else
{hanoi(n-1,a,c,b);
move(a,c);
hanoi(n-1,b,a,c);
就是这个地方,虽然知道怎么移动,但是看不懂这个程序呀...急呀谁能写一下它的递归过程,感谢

#include <stdio.h>

void move(char x,char y)
{
printf("%c-->%c\n",x,y);
}
void hanoi (int n,char one ,char two,char three)
{
if(n==1)
move (one ,three);
else
{
hanoi (n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
main()
{
int m;
printf("input the number of diskes:");
scanf("%d",&m);
printf("the step to moving %3d diskes:\n",m);
hanoi(m,'A','B','C');
}
/*运行情况如下:
input the number of diskes:3 回车
the steps to moving 3 diskes:
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C

书上说hanoi(n-1,one,three,two);是把“one”上的n-1个往“two”上移,接着move(one,three);
然后是hanoi(n-1,two,one,three)即把“two”上的n-1个往“three”上移;
|h(2,1,3,2)|h(1,1,2,3)=>move(1,3) <-----1------
| | move(1,2) <-----2------
| |h(1,3,1,2)=>move(3,2) <-----3------
|move(1,3) <-----4------
|
h(3,1,2,3) | |h(1,2,3,1)=>move(2,1) <-----5------
|h(2,2,1,3)|move(2,3) <-----6-------
| |h(1,1,2,3)=>move(1,3) <-----7------
|
*/

因为这里字母排版问题,很乱,如果想看清楚点,进我的Blog看就有了,很详细的,况且是以我的现有的不深的水平解释的
地址:http://blog.sina.com.cn/u/1241196627
希望 对你有一定帮助

如果只有1个盘子,将它从a移到c上
否则
1.将除了最后一个盘子以外的所有盘子作为一个整体,从a移到b上
2.将最后一个盘子从a移到c上
3.将那个整体再从b移到c上

在移动那个整体的时候,也采用上面这种办法,即分成三步执行:
1.将整体中的前n-1个盘子从a移到b上(注意这里的a和b已经是递归压栈后的新值)
2.将第n个盘子从a移到c上
3.将整体中的前n-1个盘子从b移到c上

所有的"整体"移动都是采用递归调用自身的办法

以n=3说明

将前2个盘子从a移到b上,递归压栈
{将前1个盘子从a'(即a)移到b'(即c)上 递归--->将1移到b'(c)上;
将第2个盘子从a'(即a)移到c'(即b)上 --->将2移到c'(b)上;
将前1个盘子从b'(即c)移到c'(即b)上 递归--->将1移到c'(b)上};
将第3个盘子从a移到c上; --->将3移到c上
将前2个盘子从b移到c上,递归压栈
{将前1个盘子从a'(即b)移到b'(即a)上 递归--->将1移到b'(a)上;
将第2个盘子从a'(即b)移到c'(即c)上;--->将2移到c'(c)上;
将前1个盘子从b'(即a)移到c'(即c)上 递归--->将1移到c'(c)上};

整个过程的移动顺序就是
1->c 2->b 1->b 3->c 1->a 2->c 1->c

楼上说得很对,不要急于把这个想明白,以后接触多了就容易理解了。先找点儿比较简单的递归例子搞明白,比如递归求n!、二叉树遍序等。

人的思维和计算机的行为毕竟有很大差别。 尤其是在刚开始时做递归和深搜的时候, 但接触多了就容易理解了。 建议不一定现在就非得弄明白这个, 即使一时明白了, 过一阵可能又忘了。