递归求解汉诺塔问题(详细解答)

article/2025/9/18 0:13:46

汉诺塔移动步数的计算

具体汉诺塔的规则大家自行百度吧,就不介绍了,这里介绍一下如何求解汉诺塔移动步数的计算思想。
当汉诺塔层数为一层时,很显然只需要一步,直接从A杆移动到C杆
在这里插入图片描述
当层数为两层时,则需要三步,先将第一个从A杆移到B杆,然后将第二个从A杆移到C杆,最后将第一个从A杆移到C杆,到这里有没有发现规律呢?
在这里插入图片描述
当层数为三层时,首先要把前两层移到B杆上,这样就可以把第三层移到C杆上了,然后再将这两层从B杆移到C杆上,上面讨论了,将两层汉诺塔从一个杆移动到另一个杆上面需要三步,所以当层数为三层时,就需要3+1+3也就是7步,我想到这里你应该发现规律了,汉诺塔移动步数的问题其实有着镜像的性质
当层数为4层时呢?
很显然,就是3+1+3+1+3+1+3也就是15步
……
当层数为n层时呢?
最终的结果就是 n-1层所需的步骤 + 1 + n-1层所需的步骤

到这里,我们发现这些完全符合递归的几个要素啊,所以可以尝试用递归求解。
首先是边界条件:也就是当n == 1时,这时候直接返回1,因为当汉诺塔层数为一层时,要用一步完成
然后是n-1层与n层的关系,刚才也找到了,就是n层的步骤等于 n-1层所需的步骤 + 1 + n-1层所需的步骤 ,也就是1+2*(n-1层所需步骤)
最后将这个关系用代码写出来

代码如下:

int my_hanoi(int num)
{if (num == 1){return 1;}return 1 + 2 * my_hanoi(num - 1);//n-1与n的关系
}int main()
{int num = 0;printf("请输入一个值:");scanf("%d", &num);int ret = my_hanoi(num);printf("%d层汉诺塔移动的步数为:%d", num, ret);return 0;
}

汉诺塔移动步骤的计算

举个四层的例子:(我说的可能会比较绕🤣)
在这里插入图片描述
若要移动四层,首先我们要做的时把上面三层从A杆借助C杆移到B杆上,然后再将第四层从A杆移动到C杆上,最后再把刚才的三层从B杆移动到C杆上,结束。
在这里插入图片描述

那么问题来了,怎么把最上面的三层移动到B杆上呢?为了完成这个问题,我们要先把三层上面的两层从A杆借助B杆移到C杆上,然后再把第三层从A杆上移动到B杆上,最后再把刚才的两层从C杆借助A杆移动到B杆上,结束。
那么问题就又来了,怎么把最上面的两层移动到C杆上呢,为了完成这个问题,我们首先将第一个从A杆移到B杆,然后将第二个从A杆移到C杆,最后将第一个从A杆移到C杆结束。
然后我们再依次返回,仅仅改变所要移动到目标杆就好了,返回到最后,我们就完成了四层的汉诺塔移动。
那n层的时候呢?
根据上面的思想,当我们要移动n层汉诺塔时,要先将上面的n-1层先从A杆借助C杆移动到B杆上,然后再将第n层移动到C杆上,最后再将刚才的n-1层从B杆借助A杆移动到C杆上,这样就完成了汉诺塔的移动。
同样的你可以尝试思考怎么移动n-1层呢?移动n-1层的时候,又涉及到移动n-2层,那怎么移动n-2层呢?n-3层呢?n-4层呢?……
想到最后,你会发现都是先通过移动第一层,来引导第二层的移动。再尝试去向,第一层最开始移动的方向是根据层数的奇偶性来的。

到这里我们发现这也符合递归的几个要素啊,所以同样可以尝试用递归求解
首先是边界条件:同样是当n == 1时,这时候我们直接输出,从A移动到C
然后是n-1层与n层的关系,我们刚才也找到了,当要移动n层汉诺塔时,要先将上面的n-1层先从A杆借助C杆移动到B杆上,然后再将第n层移动到C杆上,最后再将刚才的n-1层从B杆借助A杆移动到C杆上,这样就完成了汉诺塔的移动。
最后将这个关系用代码写出来

//可以这样理解递归函数的参数列表
//第一个参数:汉诺塔层数
//第二个参数:起始杆
//第三个参数:借助杆
//第四个参数:目标杆
void move(int n, char a, char b, char c)
{if (n == 1){printf("%c --> %c\n", a, c);return 0;}move(n - 1, a, c, b);printf("%c --> %c\n", a, c);move(n - 1, b, a, c);
}int main()
{int step = 0;printf("输入一个值:");scanf("%d", &step);move(step, 'A', 'B', 'C');return 0;
}

感谢你能看到这里🥰


http://chatgpt.dhexx.cn/article/FcRJmB7r.shtml

相关文章

汉诺塔算法

2019独角兽企业重金招聘Python工程师标准>>> 有A、B和C 3跟柱子,在A上从下往上按照从小到大的顺序放着64个圆盘,以B为中介,把盘子全部移动到C上。移动过程中,要求任意盘子的下面要么没有盘子,要么只能有比它…

汉诺塔算法的理解

2019独角兽企业重金招聘Python工程师标准>>> 当盘子数为两个时,移动图如下: 移动规律为: 步骤盘子编号源柱子目标柱子11AB22AC31BC 当盘子数为3个时: 移动规律为: 步骤盘子编号源柱子目标柱子11AC22AB31CB4…

汉诺塔递归算法

2019独角兽企业重金招聘Python工程师标准>>> import java.util.Scanner;/*** 汉诺塔* * author JayChang* */ public class HanoiResolve {/*** 移动位置* * param positionA* param positionB*/public static void move(String positionA, String positionB) {Syst…

数据结构——树和二叉树 6-1 求二叉树高度 (20 分)

本题要求给定二叉树的高度。 函数接口定义: int GetHeight( BinTree BT ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Right; }; 要求函数返回给定…

PTA 函数题 求二叉树高度(C语言)

本题要求给定二叉树的高度。 函数接口定义: int GetHeight( BinTree BT ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Right; }; 要求函数返回给定…

6-1 求二叉树高度

6-1 求二叉树高度 (15 分) 本题要求给定二叉树的高度。 函数接口定义: int GetHeight( BinTree BT );其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Rig…

二叉树的构造及求解二叉树高度

题目描述 1、参考题目解释构造一棵二叉树&#xff1b; 2、求解二叉树的高度 3、有余力同学尝试打印这棵二叉树&#xff08;以树的形态&#xff0c;非必须&#xff09; 输入 A(B(E,C(D(F(,G),),) 输出 二叉树高度为: 6 代码实现 #include <iostream> //#include &l…

二叉树4:二叉树求树高度(超级详细)

一、思路 什么是树高&#xff1f; 树的高度(或深度)就是树中结点的最大层数。 在这里使用后序遍历的递归算法。 对每一个结点都进行如下操作&#xff1a; 后序遍历其左子树求树高后序遍历其右子树求树高对这个结点进行下面操作&#xff1a; 比较其左右子树的高度大小若左&g…

二叉树的高度和深度

二叉树的高度和深度定义 &#xff08;对某个节点来说&#xff09; 深度是指从根节点到该节点的最长简单路径边的条数&#xff1b; 高度是指从最下面的叶子节点到该节点的最长简单路径边的条数&#xff1b; &#xff08;对二叉树&#xff09; 深度是从根节点数到它的叶节点&…

关于360提示发现木马—HEUR/QVM.Malware.Gen

今天用Visual Studio写的关于三层架构的程序 在启动运行时&#xff0c;弹出了360关于"检测到木马程序"的提示框&#xff1a; 虽然知道自己写的是正规程序&#xff0c;但初看时还是被吓了一跳&#xff0c;于是立马上网查阅相关资料和解答&#xff0c;结论是&#xff…

WebRTC 之 RTX

AbstractWebRTC RTX 笔记AuthorsWalter FanCategorylearning noteStatusv1.0Updated2020-08-28LicenseCC-BY-NC-ND 4.0 什么是 RTX RTX 就是重传 Retransmission, 将丢失的包重新由发送方传给接收方。 Webrtc 默认开启 RTX (重传)&#xff0c;它一般采用不同的 SSRC 进行传输&a…

红与蓝:现代Webshell检测引擎免杀对抗与实践

上半年Webshell话题很火,业界举办了数场对抗挑战赛,也发布了多篇站在安全产品侧,着重查杀思路的精彩文章,但鲜有看到以蓝军视角为主的paper。 作为多场挑战赛的参赛者及内部红蓝对抗的参与者,笔者试着站在蓝军角度,聊聊现代Webshell对抗的一些思路,也以PHP Webshell为例…

堪比熊猫烧香!中国新型蠕虫病毒大爆发!电脑瞬间报废

堪比熊猫烧香&#xff01;中国新型蠕虫病毒大爆发&#xff01;电脑瞬间报废 近日&#xff0c;深信服安全团队监测到一种名为incaseformat的病毒&#xff0c;全国各个区域都出现了被incaseformat病毒删除文件的用户。 经调查&#xff0c;该蠕虫正常情况下表现为文件夹蠕虫&#…

Dreh zelle acht hoch

Android6.0权限和SharedPreferences存储 static class MyTask extends AsyncTask<String,String,String> { Override protected String doInBackground(String... strings) { FileOutputStream outnull; InputStream inputStreamnull;//网络连接的输入流 HttpURLConnecti…

json.cp37-win32.pyd HEUR/QVM30.2.223F.Malware...

问题 使用pyinstaller导出exe,运行时候会被360杀毒报木马. 病毒类型是HEUR/QVM30.2.223F.Malware.Gen 木马文件是 pandas库下的一个文件 \Python\Python37-32\Lib\site-packages\pandas\_libs\json.cp37-win32.pyd 原因 32位的pandas文件是 json.cp37-win32.pyd (32位的,3…

Herm Chart

参考链接 https://blog.csdn.net/QianLiStudent/article/details/111872100 https://www.jianshu.com/p/4bd853a8068b 1 概念 1.1 Helm 1.1.1 Helm是什么&#xff1f; Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Pyt…

关于桌面程序被安全软件误判为HEUR:Trojan.Win32.Generic的解决方案

最近写了一个桌面程序&#xff0c;里面用了些读取系统环境变量、提取文件图标、启动外部程序之类的操作。 然后…………卡巴斯基就把它识别成了HEUR:Trojan.Win32.Generic………… 咱遵纪守法好程序&#xff0c;怎么说是木马就是木马了呢&#xff1f;&#xff1f;&#xff1f; …

从0到1学会使用SpringBoot 搭建mock Server

做过接口测试的同学一定听说过mock Server&#xff0c;大家会觉得其很神秘&#xff0c;很高大上&#xff01;mock Server出现的原因是现今的业务系统很少有孤立存在的&#xff0c;它们或多或少需要使用兄弟团队或是其他公司提供的服务&#xff0c;这给我们的联调和测试造成了麻…

Postman mockserver详细教程

转自&#xff1a; https://blog.csdn.net/testdeveloper/article/details/80559538 模客API接口链接&#xff1a;http://mock-api.com/ http://mock-api.com/ http://mock-api.com/ http://mock-api.com/ 1.发送一个request 发送请求之后在History标签下保存了请求的数据&a…

postman如何使用mockserver?

mock服务&#xff0c;实现创建一个url&#xff0c;设定response Body&#xff0c;通过访问这个假的url&#xff0c;就能得到想要的返回结果。 应用于&#xff0c;当后端接口如A没有开发完成&#xff0c;但是当前测试又依赖于接口A时&#xff0c;就可以用mock服务&#xff0c;访…