关于Python实现汉诺塔问题

article/2025/9/7 16:15:29

发文声明:在刚接触汉诺塔搬盘子这个问题时候,我是很懵的,当时也没多想,后来复习的时候才深入的去剖析了一下,对于我这种小白来讲还是不太容易的,因此我写下这篇博客,来分享一下自己的学习思路心得,希望可以帮助和我一样有困难的小伙伴们。

问题概述:汉诺塔问题,即搬盘子问题,是一个很经典的问题,它的大致内容是:有A、B、C三个区域在平面上横向放置,A称为起始区域,B称为中间区域C称为目标区域,在起始区域有3个盘子,盘子的大小是从下往上依次变小的,即最小的盘子在最上面,最大的在最下面,这样摞在一起的,我们需要做的是将所有盘子一个一个地A起始区域的盘子搬到C目标区域,过程中始终保持大盘子在下,小盘子在上,最我们需要表示出搬运步骤及搬运步数。

问题解答:我做这类问题的方法是递归法。递归法,递归法关注的是基例和链条。基例就是存在一个或多个不需要再次递归的条件,链条就是计算过程中的递归链条,简单理解递归法就是在函数内部调用函数本身。历史上有很多典型的问题都是可以用递归法解决的,例如阶乘问题,n  = n * (n-1)!,基例是当n等于1时值为1;斐波那契数列,F(n)= F(n-1)+ F(n-2),基例是当n等于1和2时值是1,等等等等问题。对于这道题来说,我们用递归法首先应该想到递归链条。假设有3个区域ABC,A起始区域上有n个盘子需要搬到C目标区域上,首先我们将这n个盘子由上到下标号为1、2、3........n号盘子,然后我们可以先将A区域中上面的n-1个盘子借助C目标区域搬到B中间区域,紧接着再把A区域中的第n号盘子,也就是最大的那个盘子放到C区域上,这样我们就完成了第一步。(PS:我们不需要考虑如何将n-1个盘子搬到B区域的操作是如何完成的)紧接着我们将B区域剩余的n-1个盘子借助A起始区域搬到C目标区域上,这就完成了搬运任务。我们需要将每一步的搬运步骤打印出来,并统计搬运步数。下面附上Pyhton实现代码:

#汉诺塔搬盘子问题
count = 0
def hanoi(n,src,dst,mid):  # src→起始区域  dst→目标区域  n→起始区域有n个盘子  global countif n == 1:print("将{}号盘子:{}->{}".format(1,src,dst)) #只有一个盘子直接放到目标区域count += 1else:hanoi(n-1,src,mid,dst) #将上面n-1个盘子借助目标区域搬到中间区域上print("将{}号盘子:{}->{}".format(n,src,dst)) #这里的n表示n号盘子#把第n号盘子搬到目标区域上count += 1  #步骤+1hanoi(n-1,mid,dst,src) #将中间柱子上的n-1盘子借助起始区域搬到目标区域#print函数所完成是把一个盘子从起始区域搬到目标区域的操作
#不关注具体操作,只关注链条(基链)

下面举一个简单的例子:有三个区域ABC,A起始区域上放有3个盘子从上到下标号为1、2、3号盘子,大小由小到大。

大概长这样      ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

首先我们调用函数

hanoi(3,"A","C","B")print("一共需要",count,"步")

函数内部语句块中文解释流程:在函数<1>hanoi(3,A,C,B)(这里ABC不加引号,偷个懒),第一个参数是3,进入函数内部执行else语句块的第一行,调用函数<2>hanoi(2,A,B,C),语句意思是将A区域上的1、2号盘子借助C区域搬到B区域上,该函数参数为2,继续进入函数内部执行else语句块中的第一行调用函数hanoi(1,A,C,B),语句意思是将A区域上的1号盘子借助B区域搬到C区域上,该步函数参数为1,直接执行if语句块内容,打印(将1号盘子:A→C)。紧接着执行<2>函数的else语句块中的第二行format(2,A,B)),打印(将2号盘子:A→B,然后执行<2>函数else语句块的第四行,调用函数hanoi(1,C,B,A)直接打印(将1号盘子:C→B至此,调用的<2>函数执行完毕紧接着执行<1>函数else语句块的第二行内容(format(3,A,C)),打印(将3号盘子:A→C至此,已经将最大的3号盘子放到了目标区域上。然后执行<1>函数else语句块中第四行(函数的最终步骤),调用函数<3>hanoi(2,B,C,A),语句的意思是将B区域上的1、2号盘子借助A区域搬到C区域上(做完这步即结束任务),继续进入<3>函数内部,参数为2,执行else语句块第一行,调用函数hanoi(1,B,A,C),直接打印(将1号盘子:B→A,再执行else语句块第二行format(2,B,C),打印(将2号盘子:B→C),最后执行else语句块的第四行,调用函数hanoi(1,A,C,A),打印(将1号盘子:A→C),至此结束整个函数调用

输出结果如下:

谢谢大家阅读此篇文章,希望对您的学习有帮助!


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

相关文章

【C语言刷题】汉诺塔问题

目录 1.汉诺塔简介 2.汉诺塔分析 &#xff08;1&#xff09;寻找规律&#xff08;采用物理中的参考系来进行推论&#xff09; ①当n1时 ②当n2时 ③当n3时 插曲&#xff1a;很多讲解汉诺塔博客&#xff0c;视频&#xff0c;很不严谨的地方&#xff0c;让初学者听不懂&am…

【算法篇】汉诺塔问题

汉诺塔问题是一个递归的经典范例。 让我们先从移动一个盘开始&#xff0c;逐渐增加需要移动的盘数。 当我们需要移动一个盘时&#xff0c;只需将该盘移动至C杆。 int c 0; void move(char a, char b) {printf("第%d步为&#xff1a;%c->%c\n",c, a, b); } 当…

C语言实现汉诺塔问题(保姆式讲解)

前言: 大家好&#xff0c;又是再一次分享文章&#xff0c;我十分感谢各位能够点开这篇花费我颇多时间才解决的汉诺塔问题&#xff0c;接下来我就要分享一下自己的所思所想&#xff0c;希望能给各位带来一些不一样的收获吧。 提醒: 汉诺塔问题的本质是函数递归&#xff0c;而函数…

关于汉诺塔问题

首先&#xff0c;我们要了解什么是汉诺塔问题。 汉诺塔问题源于古印度的一种游戏&#xff0c;而这种游戏是指在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆自下而上、由大到小按顺序放置64个金盘。而我们游戏的目标则是&#xff1a;把A杆上的金盘全部移…

【C语言】汉诺塔问题的解决办法(附图)

1.游戏规则 汉诺塔(Hanoi)游戏是在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆自下而上、由大到小按顺序放置64个盘子。游戏的目标&#xff1a;把A杆上的盘子全部移到C杆上&#xff0c;并仍保持原有顺序叠好。操作规则&#xff1a;每次只能移动一个盘子…

Python解决汉诺塔问题

问题引入 汉诺塔问题源于印度一个古老传说。相传大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定&#xff0c;任何时候&#xff0c;在小…

汉诺塔问题(C语言实现)

前言 一、汉诺塔圆盘的移动步数 二、汉诺塔圆盘移动步骤 总结 前言 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序…

Java|汉诺塔问题详解

文章目录 汉诺塔问题&#xff1a;编程要求&#xff1a;解题过程&#xff1a;代码实现&#xff1a;总结 汉诺塔问题&#xff1a; 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆…

C++解决汉诺塔问题

Description 汉诺塔&#xff08;又称河内塔&#xff09;问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A、B和C&#xff0c;A上面套着 n n n个圆的金片&#xff0c;最大的一个在底下&#xff0c;其余一个比一个小&#xff0c;依次叠上去&…

汉诺塔问题超级详解

汉诺塔 汉诺塔问题图解代码 汉诺塔问题 1&#xff0c;我们为了后期方便讲解首先进行一个简单的命名—— 起始柱&#xff1a;1&#xff1b; 过度柱&#xff1a; 2&#xff1b; 目标住&#xff1a;3&#xff1b; 2&#xff0c;由于汉诺塔问题是一个明显的递归问题&#xff0c;所以…

汉诺塔问题解析(C语言)

文章目录 背景一、汉诺塔和递归二、代码实现总结 背景 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄…

python实现汉诺塔问题

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞n片黄金圆盘。大梵天命令婆罗门把圆盘从下自上开始、按大小顺序重新摆放在另一根柱子上。并且规定&#xff0c;小圆盘上不能放…

Python实现 — — 汉诺塔问题

我们今天来看一个很有意思的实例&#xff0c;叫做汉诺塔问题。 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着…

汉诺塔问题(Python实现)

前言 1.先谈一下什么是递归&#xff1f; 我自己的理解就是&#xff1a;将自身的问题不断减小规模&#xff0c;直到减小到无法减小为止。&#xff08;到达递归结束条件&#xff09;然后从小问题开始解决&#xff0c;小问题逐个解决之后&#xff0c;大问题也就迎刃而解了&#…

汉诺塔问题详解(C语言)

文章目录 前言1. 导入汉诺塔问题2. 预备知识3. 分析问题4. 编程解决问题 前言 汉诺塔问题是一个古典的数学问题&#xff0c;本文主要和大家一起用c语言解决汉诺塔问题。 1. 导入汉诺塔问题 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜…

汉诺塔问题——递归算法

一、问题描述 汉诺塔问题是一个经典的问题。汉诺塔&#xff08;Hanoi Tower&#xff09;&#xff0c;又称河内塔&#xff0c;源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把…

汉诺塔问题详解

目录 一、汉诺塔问题 二、汉诺塔问题思路 三、图示化思路 1、汉诺塔一个盘子 2、汉诺塔两个盘子 3、汉诺塔三个盘子 4、想法 四、代码的实现 一、汉诺塔问题 汉诺塔问题是一个经典的问题。汉诺塔&#xff08;Hanoi Tower&#xff09;&#xff0c;又称河内塔&#xff0c;源…

c语言汉诺塔问题详解

一、前言 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按…

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

汉诺塔&#xff1a;汉诺塔(Tower of Hanoi)源于印度传说中&#xff0c;大梵天创造世界时造了三根金钢石柱子&#xff0c;其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定&#xff0c;在小圆盘上不能放大圆…

汉诺塔(Hanoi)问题归纳总结

一.汉诺塔问题及其递归算法 1.问题阐述 经典汉诺塔&#xff1a; 外文算法书对汉诺塔问题的描述&#xff1a; 2.算法步骤 三阶汉诺塔问题解题步骤 共需7步。 四阶汉诺塔问题解题步骤 共需15步 五阶汉诺塔问题解题步骤 可以清晰的看出分治思想以及递归过程 算法采用了分治的…