0
点赞
收藏
分享

微信扫一扫

走进递归经典——汉诺塔问题详解



目录

  • ​​传统艺能????​​
  • ​​过渡区????​​
  • ​​正片开始????​​
  • ​​问题????​​
  • ​​思路????​​
  • ​​实现????​​


传统艺能????

小编是大一菜鸟不赘述,欢迎大佬指点江山

此前博客​​点我!点我!请搜索博主 【知晓天空之蓝】​​点我!点我!请搜索博主 【知晓天空之蓝】或扫码进入!

乔乔的gitee代码库(打灰人 )​​欢迎访问,点我!​​


(https://blog.51cto.com)感谢支持!

过渡区????

现在是北京时间8:45,上午没有课,早操拉出去吹了个风,早饭买了个花卷带回寝室已经冷了,就上床肝博客了,一上床就会有莫名的心理暗示想躺平,精神毒品实锤……

走进递归经典——汉诺塔问题详解_初始化

正片开始????

问题????

汉诺塔问题是经典的递归问题。汉诺塔问题是一个经典的问题,汉诺塔(Hanoi Tower)又称河内塔,源于印度一个古老传说:大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘,问该如何操作。

走进递归经典——汉诺塔问题详解_c语言_02

思路????

首先我们以最原始的模型开始,也就是一根柱子上三个环说起,过程如下:

走进递归经典——汉诺塔问题详解_c语言_03

而这其中包含了移动一个环和两个环的情况,所以规律总结如下:

通过分析以上 3 种情况的移动思路,可以总结出一个规律:对于 n 个圆盘的汉诺塔问题,移动圆盘的过程是:将起始柱上的 n-1 个圆盘移动到辅助柱上;起始柱上遗留的 1 个圆盘移动到目标柱上;最后将辅助柱上的所有圆盘移动到目标柱上。由此推演出n个环的场景思路就是拆分成 n-1个时的场景,n-2个时的场景……直到 1个环。


这里引用一个动态图大家会更加明了走进递归经典——汉诺塔问题详解_c语言_04


实现????

递归的核心在于函数自己调用自己,是创建所需的变量,三根柱子,即创建三个字符类型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)

走进递归经典——汉诺塔问题详解_c语言_05

今天就到此为止吧家人们,摸了。

走进递归经典——汉诺塔问题详解_搜索_06



举报

相关推荐

0 条评论