- 汉诺塔规则:将A柱上的n个盘子全部移到C柱上(或是B柱上,自由选择)~
- 规定: 1.小盘必须在大盘上面
- 2.一次允许操纵一个盘子~
- 以三个盘子为例过程图解如下:
- 重点:
- 递归:在C语言中,函数自己调用自己的操作
- 我们首先清楚递归的大致思想:把一个大型的问题转化为一个与原问题相似,但规模较小的子问题来求解.直到子问题分到无法在细分,递归就结束了~
- 递归:'递'就是递推的意思,'归'就是回归的意思~(思考一下)~
- 汉诺塔思想: 假设A柱上有n个盘子~
- 若我们把这个大型问题转化细分一下,就会发现:两个盘子是最简单的情况~
- 所以可以把每一次都看成 2个盘子这种最简单的情况(即是第一个盘子为(n-1),第二个盘子为n)
- *所以 2个盘子过程如下:~
- 目的:1.n个盘子完成后需要的次数.~
- 2.打印n个盘子转移的过程~
用C语言实现:~
-
1.打印过程:
2.计算操作次数:
-
通过数学归纳法可以找出规律:n层需要 次数num==2的n次方-1
// 汉诺塔问题 void move(char x, char y)//move函数用来移动 { printf("%c—>%c\n", x, y); } void hanio(int n, char a, char b, char c)//移动过程 { if (n == 1) { move(a, c);//c为目标桩 } else { hanio(n - 1, a, c, b);//将n-1个盘从A通过C移到B move(a, c);//把剩下的一个盘子(大)从A移到C hanio(n - 1, b, a, c);//再把n-1个盘子移到C上 } } int movenum(int n)//移动次数 { if (n == 1) { return 1; } else { return (2 * movenum(n - 1) + 1);//归纳法找出次数的规律为(2的n次方-1)用递归表示<- } } int main() { int n = 0; printf("请输入你选择的层数:>"); scanf("%d", &n); int num = movenum(n); printf("%d层需要移动%d步\n", n, num); printf("具体过程如下\n"); hanio(n, 'A', 'B', 'C'); return 0; }
-
大家如果还是有些懵懂~
-
在这里,我推荐大家看【有趣的汉诺塔游戏怎么玩?把大象放冰箱里一共分几步?】https://www.bilibili.com/video/BV1gJ41177fX?vd_source=481b94979c1535d558f462f9d39aa55d
-
当初我就是看这位老师讲解弄懂的~
-
希望大家有所收获!~