汉诺塔问题——递归算法

发布时间:2026/7/26 17:34:49

汉诺塔问题——递归算法
一、问题描述汉诺塔问题是一个经典的问题。汉诺塔Hanoi Tower又称河内塔源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定任何时候在小圆盘上都不能放大圆盘且在三根柱子之间一次只能移动一个圆盘。问应该如何操作二、递归算法个人认为递归算法核心主要有以下几点递归变量、递归过程、递归结束条件其中难点在于怎么模拟递归过程以及如何寻找递归变量对于不同的问题这两个核心所呈现的具体代码都是不一样的但都有共同的特点。所以建议读者不仅仅以解决汉诺塔问题为目标更要理解递归思想掌握递归算法在各种问题中的使用。1.递归变量在每一个能够使用递归算法解决的问题中题目会提供关键信息我们需要在其中找到递归变量这取决于你对信息解剖能力如果一开始无法快速找到递归变量不用过于伤心在往后的不断学习中你会慢慢提高自己的编程能力能够快速分析现实问题和程序之间的关系从而找到递归变量那些变量是在递归函数中表示递归层数或者起到其它作用例如汉诺塔问题中层数n以及柱子位置A,B,C则是递归开始。2.递归过程递归过程是递归算法中的关键行为这个关键行为在解决问题中可以不断重复循环最后递归变量达到结束条件就退出递归函数。如何在问题中找到这个关键行为是较难的但这也是区分您是否理解递归思想。在分析汉诺塔问题我们可以借助位置B先把n-1层以上的圆盘放到B位置然后把第n个圆盘放到C位置上最后将n-1层以上的圆盘放到C位置上那么就能够轻松解决问题了但是对于n-1层是如何移动B位置上的的呢聪明的你可能已经发现n-1层圆盘从A移动到B上其实与n层圆盘移动到C位置上是一样的过程即先把n-2层圆盘放到位置C上再把第n-1个圆盘放到位置B 上最后n-2层圆盘放到B上那么对于n-2层圆盘是如何放到C上的呢?其实这是一个重复性的过程。在这里为了将问题简单化我们设置了三个变量开始位置A、辅助位置B、目标位置C开始位置A放置所有圆盘将n-1层圆盘放置辅助位置B后再将第n个圆盘放置目标位置C然后将n-1层圆盘的位置B作为开始位置A原来的开始位置A作为辅助位置B将所有圆盘放到目标位置C。这个过程的关键点在于什么时候开始位置A和辅助位置B互换我们最开始需要把n-1层圆盘放到辅助位置B在放置n-1层圆盘时我们把辅助位置B当作是目标位置C将其将第n-1个圆盘放到它的目标位置那么如此一来n-2层圆盘需要一个辅助位置所以此时辅助位置B与目标位置互换按照这个想法不断寻找上一层圆盘直至第一层圆盘时我们将其放置在目标位置C上即可注意此时的目标位置C可能不是原来的C然后在回溯的过程中不断输入移动的圆盘作用是看到圆盘移动的过程。当n-1层圆盘移动到辅助位置B时将第n个移动到目标位置C后需要将第n-1个圆盘移动到目标位置C此时则借助开始位置A所以在这里开始位置A需要与辅助位置B互换原本n-1层圆盘所在的位置变成开始位置然后重复搬圆盘的过程直至所有圆盘放入目标圆盘完成递归。3.递归结束条件递归结束条件是用以结束递归过程的重复如果没有结束条件函数将会一直递归下去使得程序陷入死循环中。那么如何找到递归结束条件呢可以从递归变量中寻找例如汉诺塔问题中递归结束条件语句在于层数当发现递归到第一层圆盘时我们可以直接将它放到目标位置上然后就是回溯的过程这个工作就交给计算机我们只需分析问题写出解决问题的代码。三、汉诺塔问题具体代码#include iostream using namespace std; void move(int n, char A, char B, char C) { //n代表现在需要将第n个圆盘放到目标位置C if (n 1) //当递归到第1个圆盘时直接将其放到目标位置C cout A - C endl; else { move(n - 1,A,C,B); //1.将n-1层圆盘放到辅助位置B //2.对于第n-1个圆盘把B当作目标位置C当作辅助位置所以BC互换 cout A - C endl; //将第n个圆盘放到目标位置C上 move(n - 1,B,A,C); //1.将n-1层圆盘放到目标位置C //2.对于n-2层圆盘A当作辅助位置B当作开始位置所以AB互换 } } int main() { move(64,A, B, C); //开始时A是开始位置B是辅助位置C是目标位置 return 0; }注意本代码以64层圆盘移动若需要其他层圆盘只需修改64数字即可。

相关新闻

华为MetaERP Oracle EBS 与 Oracle Fusion 库存成本核算对比整体架构差异在深入业务场景之前,需要先理解两者在成本模块架构上的根本差异:Oracle EBS:成本核算

华为MetaERP Oracle EBS 与 Oracle Fusion 库存成本核算对比整体架构差异在深入业务场景之前,需要先理解两者在成本模块架构上的根本差异:Oracle EBS:成本核算

2026/7/26 17:24:48

Oracle EBS 与 Oracle Fusion 库存成本核算对比整体架构差异在深入业务场景之前,需要先理解两者在成本模块架构上的根本差异:Oracle EBS:成本核算内嵌于库存模块(Inventory),通过事务处理(Mater…

AI驱动的3D可视化建模:从零基础到专业级

AI驱动的3D可视化建模:从零基础到专业级

2026/7/26 17:24:48

1. 项目背景与核心价值 去年在参与某智慧园区项目时,我们团队需要快速构建一个能实时反映设备状态的3D可视化平台。当时尝试了市面上七种主流工具,从传统建模软件到新兴的低代码平台,最终发现真正能同时满足"零基础可操作"和"…

深入解析AM261x SoC外设集成:从时钟、中断到DMA的实战指南

深入解析AM261x SoC外设集成:从时钟、中断到DMA的实战指南

2026/7/26 17:24:48

1. 项目概述与核心价值 在嵌入式系统开发,尤其是基于复杂SoC(System on Chip)的设计中,外设集成往往是决定项目成败的关键一步。它不仅仅是把GPIO、I2C、SPI、UART这些模块“挂”到总线上那么简单,其背后是一套关于时钟…

Counterfeit-V3.0:基于BLIP-2技术的AI艺术生成完全指南

Counterfeit-V3.0:基于BLIP-2技术的AI艺术生成完全指南

2026/7/26 18:24:50

Counterfeit-V3.0:基于BLIP-2技术的AI艺术生成完全指南 【免费下载链接】Counterfeit-V3.0 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/Counterfeit-V3.0 在当今AI艺术创作领域,Counterfeit-V3.0凭借其独特的BLIP-2集成技术和卓越…

告别重复图片困扰:AntiDupl.NET如何帮你智能清理图像库

告别重复图片困扰:AntiDupl.NET如何帮你智能清理图像库

2026/7/26 18:24:50

告别重复图片困扰:AntiDupl.NET如何帮你智能清理图像库 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 在数字时代,我们的电脑里堆积着成千上万…

MHY扫码登录器:一键登录米哈游四大热门游戏的终极解决方案

MHY扫码登录器:一键登录米哈游四大热门游戏的终极解决方案

2026/7/26 18:24:50

MHY扫码登录器:一键登录米哈游四大热门游戏的终极解决方案 【免费下载链接】MHY_Scanner MHY扫码登录器,支持从直播流抢码。 项目地址: https://gitcode.com/gh_mirrors/mh/MHY_Scanner 还在为每次登录米哈游游戏都要拿起手机扫码而烦恼吗&#x…

星露谷物语终极创意画布:用Content Patcher零代码打造你的个性化农场世界

星露谷物语终极创意画布:用Content Patcher零代码打造你的个性化农场世界

2026/7/26 18:24:50

星露谷物语终极创意画布:用Content Patcher零代码打造你的个性化农场世界 【免费下载链接】StardewMods Mods for Stardew Valley using SMAPI. 项目地址: https://gitcode.com/gh_mirrors/st/StardewMods 你是否曾幻想过为星露谷的每个季节设计独特的风景&a…

5分钟在Windows上安装Android应用:APK安装器终极指南

5分钟在Windows上安装Android应用:APK安装器终极指南

2026/7/26 18:24:50

5分钟在Windows上安装Android应用:APK安装器终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为Windows电脑无法直接运行Android应用而烦恼吗&a…

Remix Icon 完全指南:3200+免费矢量图标库的终极使用教程

Remix Icon 完全指南:3200+免费矢量图标库的终极使用教程

2026/7/26 18:14:50

Remix Icon 完全指南:3200免费矢量图标库的终极使用教程 【免费下载链接】RemixIcon Open source neutral style icon system 项目地址: https://gitcode.com/gh_mirrors/re/RemixIcon 还在为项目寻找完美的图标而烦恼吗?Remix Icon 开源图标库为…

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

2026/7/26 0:04:02

目标:电脑作为RTSP 服务端,循环推送 H264/H265 视频流; RDK X5 通过 rtsp2display 拉流预览,完全不需要在开发板编译 live555。 提供两套成熟方案: ✅ 方案 A:FFmpeg(最简单,优先推…

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

2026/7/26 0:04:02

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

2026/7/26 0:04:02

说实话,提到PDF拆分再压缩,我真是被折腾得够呛。 上个月公司年度合同归档,一份300多页的PDF总合同,需要按年份拆分成三个独立文件,再分别压缩到10MB以内方便邮件发送各部门确认。我心想这还不简单?先找个海…

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

2026/7/26 0:04:02

目标:电脑作为RTSP 服务端,循环推送 H264/H265 视频流; RDK X5 通过 rtsp2display 拉流预览,完全不需要在开发板编译 live555。 提供两套成熟方案: ✅ 方案 A:FFmpeg(最简单,优先推…

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

2026/7/26 0:04:02

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

2026/7/26 0:04:02

说实话,提到PDF拆分再压缩,我真是被折腾得够呛。 上个月公司年度合同归档,一份300多页的PDF总合同,需要按年份拆分成三个独立文件,再分别压缩到10MB以内方便邮件发送各部门确认。我心想这还不简单?先找个海…