一、问题大意
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?(百度百科)现要求写出一个代码,表明移动圆盘的过程。
二、大致思路
递归的问题不用想的很复杂,这道题目在思考起来,应该从最后的结果入手:除最小的圆盘外,其他的圆盘已经在第三根柱子上了,而且按照从小到大的顺序排列着,现在只需要将最后一个并且是最小的圆盘移到第三根柱子上就大功告成了。
我的代码是用A、B、C三个字母代表三根柱子,A->B表示从把A的圆盘移到B上。既然是递归,那么就得思考一下递归到何时,递归终止。要说终止,上文已经说了,最小的那一个圆盘落在第三根柱子上就终止了。也就是n等于1时终止,那么具体的移动过程是一个什么样的思路呢?
假设:
我们已经拥有了解决这个问题的函数hannuota(int n,char A,char B,char C)
a、那么,依照上述绿色的文字,我们需要把n-1个圆盘通过C移动到B后,最大的那一个圆盘才能移动到C上,所以就有:
hannuota(n-1,A,C,B);
b、然后显示A->C上"printf("%c->%c\n",A,C);"这里看似是A->C,其实是由传递到A、C对应位置的参数确定的,所以也就可以输出移动过程。(我觉得这是本题最巧妙的存在)
b、最大的圆盘移动到C上之后,B上的剩余的圆盘需要借助A移动到C上。所以就有:hannuota(n-1,B,A,C)
这样就解决问题啊!
三、具体实现
#include<stdio.h>
#include<stdlib.h>
int hannuota(int n, char A, char B, char C)//用大写的ABC代替汉诺塔的三根柱子
{if (n == 1)printf("%c->%c\n", A, C); //当n=1时,直接把盘子从A移动到C,//也是递归终止的条件else{hannuota(n - 1, A, C, B); //把A的n-1个盘子通过C移动到Bprintf("%c->%c\n", A, C); //显示从A移动到C的所有的圆盘的过程,因为传参的不同//所以可以显示过程hannuota(n - 1, B, A, C); //把B上面的n-1个盘通过A移动到C}return 0;
}int main()
{printf("请输入汉诺塔的层数:\n");int n;scanf("%d", &n);printf("汉诺塔移动过程:\n");hannuota(n, 'A', 'B', 'C');system("pause");return 0;
}
四、实验结果