来个大神帮我理解下汉诺塔的算法好么,绕的好晕
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里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
退出条件
参数有哪些
返回值是什么
局部变量有哪些
全局变量有哪些
何时输出
会不会导致堆栈溢出
[解决办法]
第二句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时就可以直接挪