有A、B、C三根细柱子,其中A柱子上从上到下堆放着n个由小到大的环形盘子,将A柱子上的盘子移动到C柱子上,以B柱子为中转站,且移动过程中大盘子不能放在小盘子上(在B柱子从上到下也要遵循也要由小到大的摆放)。
分析【以三个盘子为例】实现效果如下图所示
将盘子进行编号,移动顺序为
第一次:盘1从A移到C
第二次:盘2从A移到B
第三次:盘1从C移到B
第四次:盘3从A移到C
第五次:盘1从B移到A
第六次:盘2从B移到C
第七次:盘1从A移到C
过程如下图所示
编程思路
(1) 最简单的就就是只有一个盘子:
n==1,直接从A盘移动到C盘(这个就是基线条件)
(2)n大于等于2,将A柱上的n-1个移到B柱上,只留下第n个,然后再将B柱上的n-2个移到A柱上,留下第n-1个……使用n-1调用自己(递归条件)
C语言代码
//汉诺塔问题(Hanoi) #include代码解释#include void Hanoi(int n,char a,char b,char c) { if (n==1) printf("将编号为%d的盘子从%c移到%cn",n,a,c); else { Hanoi(n-1,a,c,b); printf("将编号为%d的盘子从%c移到%cn",n,a,c); Hanoi(n-1,b,a,c); } } int main() { int n; printf("请输入要移动盘子的个数:"); scanf("%d", &n); Hanoi(n,'A','B','C'); system("pause"); }
同样以三个盘子为例,解释自定义函数Hanoi函数的运算过程
(1)首先输入移动的盘子个数:3
(2)使用Hanoi函数:Hanoi(n,'A','B','C');——意思是将三个盘子从A柱移动到C柱,中转柱为B柱
(3)n不等于1,执行语句
Hanoi(n-1,a,c,b);
printf("将编号为%d的盘子从%c移到%cn",n,a,c);
Hanoi(n-1,b,a,c);
即
图中的ABC均为实际柱子的编号,是实际意义,不是规范的代码。



