新标志308:关于hanio的困惑~~~~

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/10 12:04:59
void move(char x,char y)
{
printf("%c-->%c\n",x,y);
}
void hanoi(int n,char one,char tow,char three)/* 将N个盘从ONE座借助TWO座,移动到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 disks:");
scanf("%d",&m);
printf("the set to moving %3d disks:\n",m);
hanoi(m,'A','B','C');

}

当 m=3 的时候
输出的第一个是:
A-->C
当 m=4 的时候
输出的第一个是:
A-->B

昨天有人的答案解答 M=3 的时候是这么写的
hanoi(3,'A','B','C') 执行else语句 hanoi(n-1,one,three,two);
hanoi(2,'A','C','B') 执行else语句 hanoi(n-1,one,three,two);
hanoi(1,'A','B','C') 执行if语句 move(one,three);
move('A','C') 打印的第一条语句

我认为说的不对
如果要是象上面所说的, 那么就不会出现第一个输出是 A-->B的情况, 而总是第一个输出是 A-->C
请高人帮忙解答一下 A-->B 是如何得来的?
(递归我已仔细看过,不过这个还是没看懂)
谢谢 ~~~

呵呵
你可以这样理解
hanoi(n-1,a,c,b); // 把剩余n-1个从A通过C移动到B
move(a,c); // 从A移动到C
hanoi(n-1,b,a,c); // 把剩余n-1个从B通过a移动到C
这是递归
你可用模拟压栈方式解,画个图,
比如说
honoi(3,a,b,c) (1)-> honoi (2,a,c,b) -> honoi(1,a,b,c) ....
(2)-> honoi (2,b,c,a) -> honoi(1,b,a,c) ....