读书人

来个大神帮小弟我理解下汉诺塔的算法好

发布时间: 2013-04-20 19:43:01 作者: rapoo

来个大神帮我理解下汉诺塔的算法好么,绕的好晕

void hanoi(int n, char A, char B, char C) 
{
if(n == 1)
{
printf("将第 %d 个盘子由 %c 挪到 %c 上\n\n", n, A, C);
i++;
}
else
{
hanoi(n-1, A, C, B);
printf("将第 %d 个盘子由 %c 挪到 %c 上\n\n", n, A, C);
hanoi(n-1, B, A, C);
i++;
}
}

看得好晕,就是
hanoi(n-1, A, C, B);
printf("将第 %d 个盘子由 %c 挪到 %c 上\n\n", n, A, C);
hanoi(n-1, B, A, C);

这两句,他A B C的顺序为什么是这样的,请大神告诉我怎么理解这个
[解决办法]
两个函数的最终目的都是将剩余的盘子的最下面的盘子放在C上。

第一步:如果想把A最下面的盘子放到C上,就必须把余下的n-1个盘子放到B,所以hanoi(n-1, A, C, B);相当于把n-1个盘子放在B上(即等于最下面的盘子放在了C上了)。

第二步:如果想把B上最下面的盘子放到C上,就必须把余下的n-2个盘子放到C上,最下的盘子就放在了A上(这时就等于放在了C上),所以为函数hanoi(n-1, B, A, C);

其它的情况都被这两种情况包括了。。。

个人愚见。


[解决办法]
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
退出条件
参数有哪些
返回值是什么
局部变量有哪些
全局变量有哪些
何时输出
会不会导致堆栈溢出

[解决办法]
引用:
第二步:如果想把B上最下面的盘子放到C上,就必须把余下的n-2个盘子放到C上,最下的盘子就放在了A上(这时就等于放在了C上),所以为函数hanoi(n-1, B, A, C);

这句真心没看懂要把B上面最下的盘子放到C上,把剩下n-2个盘子放到C上,这时候再把最下面的盘子放到A上就算是放在C上,可是怎么放上去啊,大的不能放在小的上面啊


第二句hanoi(n-1,B,A,C);经过第一步后,得到的结果是:B上有n-1个盘子,A上没有盘子,C上有一个最大的盘子,接下来要做的是将B上的n-1个盘子,利用A移动到C盘上,来实现将A上的n个盘子移动到C盘上的最终目的,故有hanoi(n-1,B,A,C).
个人意见
[解决办法]
递归问题最好先搞懂递归的结束条件,汉诺塔的结束条件就是盘子为1时就可以直接挪

读书人网 >C++

热点推荐