图解汉诺塔问题(递归求解)

C语言实现汉诺塔问题【图解和演示】 本文将从汉诺塔问题的背景、过程原理,再到C语言代码来解释汉诺塔问题 阅读详情

原文链接:https://blog.youkuaiyun.com/qq_37873310/article/details/80461767

汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 --引用维基百科

单看这个问题描述有点让人抓瞎,这是当然,无论多么简单的问题描述,在没有建立具体地模型之前都是让人不知所云的,仅仅用生活中的语言去描述一些数学或算法问题往往会让听者产生理解偏差,这也和每个的理解能力和思维方式有很大关系,这就显示出数学的强大了,数学让问题不再模糊,参数和公式组成的模型让问题不再有理解偏差和误区,只可惜数学没学好,看来以后还得回来把高数、概率论这些给补回来。

说了一些题外话,下面来对汉诺塔问题进行解释和建立模型

在这里插入图片描述

这是示意图,a是起始柱,c是目标柱,b起到中转作用

在进行转移操作时,都必须确保大盘在小盘下面,且每次只能移动一个圆盘,最终c柱上有所有的盘子且也是从上到下按从小到大的顺序。

很多时候看到这些蛋疼和矫情操作就觉得数学家真是思维清奇、智慧如海,嗯还有吃饱了撑的,某兄台邪魅地一笑,道:直接把c和a交换位置不就行了,我想这位兄台以后或成大器或被人打死。
问题看起来并不复杂,当a柱子上只有一个盘子时只要把那个盘子直接移到c就行了,
有两个盘子的话把1号盘先移到b柱,在把2号盘移到c柱,最后把b柱上的1号盘移到c柱就行了,
但现在我们要移动的是64个盘子,要是我们自己手动操作,那画面会很美,闲着无聊的人可以试试,推荐去网上找找汉诺塔的小游戏,这也可以帮你加深对这个问题的理解。

下面我用图来描述64个盘子的转移流程
在这里插入图片描述

这里我们先把上方的63个盘子看成整体,这下就等于只有两个盘子,自然很容易了,我们只要完成两个盘子的转移就行了,好了现在我们先不管第64个盘子,假设a柱只有63个盘子,与之前一样的解决方式,前62个盘子先完成移动目标。嗯,就这样一步步向前找到可以直接移动的盘子,62,61,60,…,2,1,最终,最上方的盘子是可以直接移动到c柱的,那就好办了,我们的2号盘也能完成向c柱的转移,这时c柱上时已经转移成功的2个盘,于是3号盘也可以了,一直到第64号盘。

using System;
using System.Collections.Generic;
 
namespace 汉诺塔问题_递归解决
{
   
    class Program
    {       
        static void Main(string[] args)
        {
            HanNuo(64, 'a', 'b', 'c');
 
            Console.ReadKey();
        }
 
        /// <summary>
        /// 汉诺塔问题解决方法
        /// </summary>
        /// <param name="n">汉诺塔的层数</param>
        /// <param name="a">承载最初圆盘的柱子</param>
        /// <param name="b">起到中转作用的柱子</param>
        /// <param name="c">移动到的目标柱子</param>
        static void HanNuo(int n, char a, char b, char c)
        {
            if (n == 1)   //这也是递归的终止条件
            {
                Console.WriteLine("将盘子[{0}]从 {1} -----> {2}", n, a, c); //控制台输出每次操作盘子的动向
            }
            else
            {
                HanNuo(n - 1, a, c, b);      //将a柱子上的从上到下n-1个盘移到b柱子上
                Console.WriteLine("将盘子[{0}]从 {1} -----> {2}", n, a, c);
                HanNuo(n - 1, b, a, c);      //将b柱子上的n-1个盘子移到c柱子上
            }
        }
    }
}

代码很简洁,可能对于递归不是很理解的同学觉得有些吃力,下面我来具体解释下递归的流程。

当n=64时,前63个要想办法成功移动到b柱上,64号是Boss,他不管上面的63个小弟用什么办法,我可以先等着,前面63个小弟可以利用我的c柱,于是64号在等着上面63号完成移到b柱,现在63是临时老大,他也想去c柱,于是他命令前62号移到b柱,他等着,62号也采取之前两个的做法,于是这个命令一直往前传,没办法,上面被压着自己也没法动啊。 终于到了1号,他是现在唯一能动的,于是1号移动到了b柱,好了,2号可以到c柱,2第一个到目的地,心里十分激动,我都到c柱,舒服。不过当他看到a柱上的3号时,猛然一惊,我还有个上司,好吧得完成任务啊,于是让1号移到c柱,3号可以到b柱了,之后1号和2号在想办法到b柱,于是1,2,3号在b柱,4号一看很满意,但我得到b柱啊,嗯,1,2,3号你们按照刚才的办法到c柱,空出b柱给我。唉,接着折腾,后面的5号一直到63号都是这么折腾的,终于前63号移动到b柱,64号直接跑到了c柱,他觉得这些小弟办事效率真不行,不过他还是招呼小弟到c柱。 于是剩下在b柱的63个小弟还要再干一遍他们在a柱上干的事,这里来看,1号操作的频率是最高的,而64号只要移动一次就行了,要是在现实中让人这么去干,估计早就被逼疯了。 如果真要解释代码的每一步执行过程,那会很乱,两层递归,最后自己也会被绕的晕头转向,这个时候只要理解递归最终的解决的问题是什么就行了,中间的事交给程序,递归可以很绕也可以很直接,我们按照最直接的理解就行了。
最后关于递归算法,这中解决问题的方法也只有计算机才喜欢,我们虽然看着代码很简单,但真要深入理解也是很费脑细胞的,不过递归确实有中数学上的简洁美和逻辑美。

经典递归算法—汉诺塔问题(含代码示例) 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。 阅读详情

相关推荐

图解汉诺塔,用Python实现经典递归

感谢漂流的云的图解汉诺塔问题(递归求解) (1)先从最简单的模型开始,假如A柱有2个盘,我们的任务是把这两个盘按照规则(小叠在大上)移到C柱。操作步骤如下所示: (2)现在把原始时A柱盘子数增加到100,那步骤不言而喻变得很复杂,但是我们可以通过一种方法把复杂的问题简单化: 可能此时你会觉得什么!怎么可以直接把这一大块就这样移过来!我们可以把那一大块红色再次看为2与一大块,让2成为最大的蓝色,...

Mars的博客 2万+

汉诺塔问题解析以及代码实现

汉诺塔问题是递归的经典问题,本文主要介绍汉诺塔问题的解决思路以及代码实现。本文章主要将汉诺塔问题的分析以及用递归实现,首先要了解汉诺塔的解决办法,然后利用递归的大事化小将其解决。为自己学习后的思考,仅供参考!前言一、什么是汉诺塔问题?二、1.3.

2303_77528589的博客 2033

汉诺塔问题(递归,含图解)

1)递归    在计算机内的递归是利用栈技术实现的(栈也就是先进后出,过两天会出介绍,别错过),递归也就是函数的调用问题,后调用先返回,所以我们写递归函数都是从最末尾的过程往前面写。就有一个思想递归就是一个复杂的过程从最后面往前推到最简单的情况,借由计算机从简单到复杂一层一层返回推导。2)经典问题:Hanoi1.抽象出实现的步骤(递归的思想,一般看n和n-1之间的关系)    1)将n-1块从A以...

[SZU_Crayon] 2878

汉诺塔游戏

汉诺塔游戏: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 #背景介绍 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的

qq_45625194的博客 1146

【C语言】递归详解汉诺塔问题

递归 + 图解详细讲解汉诺塔移动次数和打印的过程

StackFrame 2万+

机器学习kaggle案例:风控评分卡模型(Give_Me_Some_Credit)

kaggle链接:https://www.kaggle.com/c/GiveMeSomeCredit ipynb文件:https://github.com/824024445/KaggleCases/blob/master/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0kaggle%E6%A1%88%E4%BE%8B%EF%BC%9A%E9%A3%8E%E6%8E%A7%...

weixin_42662126的博客 1万+

详解C语言函数递归经典问题:汉诺塔(图+代码)

很多人不理解汉诺塔可能是因为它不是像求阶乘这样的有明确的式子,比较抽象。其实函数递归就是写出过程,就是要完成的目标,加上终止条件,组成一个函数即可。如果函数递归不太理解可以多耍点函数递归的题目,慢慢的就理解函数递归的本质了。

每篇博客都不是最终版,都会随着我的学习更新 2万+

Windows——Nessus安装(无限制)

Nessus手把手图文安装,解除ip限制~

网安小白的博客 9444

算法:图解汉诺塔问题(递归求解)

汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 下面来对汉诺塔问题进行解释和建立模型 这是示意图,a是起始柱,c是目标柱,b起到中转作用 在进行转移操作时,都必须确保大盘在小盘下面,且每次只能移动一个圆盘,最终c柱上有所有的盘子且也是从上到下按从小到大的顺序。 下面我用图来描.

OceanStar的博客 4745

Electron多窗口开发避坑指南:Pinia状态同步的3种解决方案对比

本文深入探讨了在Electron多窗口应用中实现Pinia状态同步的三种核心方案。针对Electron多窗口架构下状态隔离的挑战,文章对比了基础事件通信、共享存储以及智能Pinia插件等方案的优劣与适用场景,并提供了生产级的实现指南与选型建议,帮助开发者构建健壮高效的桌面应用。

spice的博客 479

如何读懂CiteSpace图谱?科研小白必看的节点颜色/年轮/聚类解读手册

本文详细解析CiteSpace图谱的核心视觉元素,包括节点颜色、年轮和聚类标识,帮助科研人员准确解读数据分析结果。通过生物医学案例展示如何从图谱中识别关键文献和研究趋势,提供五步系统解读法和常见错误规避策略,助力科研小白快速掌握文献计量分析技巧。

weixin_29179311的博客 313

图解汉诺塔问题(递归求解-C语言实现)

1.汉诺塔问题 问题概述: 求解思路: 代码: 2.青蛙跳台阶问题 问题概述: 求解思路: 代码:

xxzaa的博客 832

ChatGPT and Claude国内使用站点

这篇博客介绍了不同的AI聊天平台和定价信息,主要对比了ChatGPT和Claude两款产品。文章列出了多个提供聊天服务的AI平台,包括RawChat、ChatGPTPlus、ChatOpens、Wildcard和2233.ai等,并提供了每个平台的网页链接和定价详情。特别关注了Claude平台,介绍了其普通账号与会员账号的不同,以及相关的定价信息。此外,还提到了一些虚拟卡定价和服务细节,为用户选择合适的AI服务提供了多种参考。

nisidjndn的博客 1万+

手撕“汉诺塔算法”之详细图解

hello,你好呀,我是灰小猿,一个超会写bug的程序猿, 今天和大家分享一个递归经典算法案例---“汉诺塔”。 汉诺塔问题回顾 汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 这是一个著名的问题,几乎所有的教材上都有对这个问题的介绍。由于条件是: 借助一个中转柱,使起始柱

累计发表博客60余万字,优快云 博客专家、Java 领域优质创作者、华为云享专家、阿里云专家博主。专注分享 Java 优质文章,毕设实战项目开发,全网粉丝10W+ 1万+

手把手入门YOLO到改进优化教程 | 【P1基础篇】YOLOv8网络架构原理

本节先来学习基础知识,以YOLOv8进行讲解入门, 拿YOLOv8入手掌握YOLO的底层逻辑 ,也可以基于此来轻松学习后面更新的YOLO系列 (大部分YOLO版本的核心思想一致,更新是基于旧版本做结构升级、优化策略,学习成本会越来越低)。

嵌入式阿齐Archie 2万+

52、Power BI Desktop 数据筛选全攻略

本文全面介绍了Power BI Desktop中各类数据筛选功能的使用方法,涵盖布尔型数据筛选、高级文本筛选、Top N筛选、可视化级别、页面级别和报告级别筛选等核心操作。通过详细步骤、流程图和实际案例,帮助用户深入理解筛选器的层级关系与综合应用技巧,并提供常见问题解决方案,助力高效精准的数据分析与可视化展示。

linux6sysadmin的博客 110

Java实现汉诺塔问题

详解汉诺塔如何递归及递归的过程(图解)

Zzzzmo_的博客 978

华为交换机、路由器配置静态路由实现不同网段通信

华为交换机、路由器配置静态路由实现不同网段通信。在主核心交换机上配置vlanif10 192.168.10.254/24,vlanif20 192.168.20.254/24,vlanif100 192.168.100.1/24,PC1:192.168.10.1能ping通PC2:192.168.20.1,也能ping通PC3:192.168.30.1,交换机和路由器使用静态路由。

星如雨落 6460

LeetCode:面试题 08.06. 汉诺塔问题

面试题 08.06. 汉诺塔问题 问题描述有 A,B,C 三根柱子,A 上面有 n 个盘子,我们想把 A 上面的盘子移动到 C 上,但是要满足以下三个条件: 每次只能移动一个盘子;盘子只能从柱子顶端滑出移到下一根柱子;盘子只能叠在比它大的盘子上。 解题思路:递归与分治这是一道递归方法的经典题目,乍一想还挺难理清头绪的,我们不妨先从简单的入手。 假设 n = 1,只有一个盘子,很简单,直接把它从 ...

Ternence_zq的博客 138

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

递归调用——汉诺塔问题

递归问题一直是我没弄懂的问题,就是不明白递归在调用函数的时候实现过程是怎么一回事,递归函数在调用的过程中代码的执行顺序是怎样的,看到有博主做了一个很形象的解释:说从前有座山,山里有座庙,庙里有个老和尚,老和尚在讲故事,故事是说从前有座山,山里有座庙,庙里有个老和尚,老和尚在讲故事,故事是说从前有座山,山里有座庙,庙里有个老和尚,老和尚在讲故事。。。。。。对,就是这种反复循环我不懂; 现就汉诺塔问题...

qq_45302622的博客 1022

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

python基础入门——图解汉诺塔,用Python实现经典递归

...

qq_35690171的博客 300

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

递归:解决汉诺塔问题(数据结构3.2 P103)

关于汉诺塔问题我思考了一段时间。最后总结原因之前想不明白还是对递归问题没有深入理解。我的另一篇博文《递归详解》已经很好的介绍了递归的原理。 分析汉诺塔问题:由以下三步组成 1 用C做过度,将A柱上的n-1个盘子直接移到C柱上 2 将A柱上的最后一个盘子移动到C柱上。 3  用A做过度,将B柱上的n-1个盘子直接移到C柱上 由此将移动n个盘子的汉诺塔问题归结为移动n-1

路漫漫其修远 1790

(秒懂)递归思想解汉诺塔

原形:有A,B,C三根柱子,A柱上按大小顺序从下往上摞着n片圆盘,现在要将这些圆盘从A柱移至C柱,并保持上小下大的顺序。移动规则如下:1、每次只能移动一个盘。2、大盘不能放在小盘上。 思想:n层以上的盘子借助全部挪到B柱,然后第n个挪到C柱,B柱上的n-1个盘子再全部挪到C柱。第n个盘子最大,尽管放在上面没有问题,第n个盘子可以的存在。这样n-1个盘全部挪到B柱,与n个盘全部挪到C柱所面临的问题是...

释❤ 464

汉诺塔的图解递归算法

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根...

Rnan_prince的博客 10万+
上一篇: 2019
下一篇: 返回数据存在"$ref":"$.data.*** "的问题。
java_xxxx
博客等级 码龄9年 127粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值