思路👏
首先我们以最原始的模型开始,也就是一根柱子上三个环说起,过程如下:
而这其中包含了移动一个环和两个环的情况,所以规律总结如下:
通过分析以上 3 种情况的移动思路,可以总结出一个规律:对于 n 个圆盘的汉诺塔问题,移动圆盘的过程是:将起始柱上的 n-1 个圆盘移动到辅助柱上;起始柱上遗留的 1 个圆盘移动到目标柱上;最后将辅助柱上的所有圆盘移动到目标柱上。由此推演出n个环的场景思路就是拆分成 n-1个时的场景,n-2个时的场景……直到 1个环。
实现👏
递归的核心在于函数自己调用自己,是创建所需的变量,三根柱子,即创建三个字符类型A,B,C和代表次数的整型n;我用 printf函数模拟它的实验结果;在根据我们所需的计算要求自义定函数 Hanoi,接下来就是把我们的计算过程串联进去,加入魔法,注入灵魂。
#include<stdio.h> void Hanoi(int n, char a, char b, char c)// 初始化自定义函数Hanoi { if (1 == n)// if语句首先踢出特殊情况环数为1 { printf("Move %d:from %c to %c\n",n,a, b);// 为1时直接a到b } else { Hanoi(n - 1, a, b, c);//>1时,先将(n-1)个盘子从a借助b移到c printf("Move %d:from %c to%c\n",n, a, b);//将a上第n个移到b Hanoi(n - 1, c, a, b);//将c上的(n-1)个盘子从c借助a移到b } } int main() { int n = 0;//定义环数n printf("please input the number of disks:"); scanf("%d", &n); printf("steps of moving the disks=%d\n", n); Hanoi(n, 'A', 'B', 'C'); return 0;
执行结果如下:(这里假设环数为5)