学习递归时,很多小伙伴对汉诺塔的递归算法非常疑惑,不清楚那么复杂的移动过程,为何用四五行代码就给解决了。汉诺塔问题:有三根柱子A,B,C。A柱上有若干碟子,每次移动一块碟子,小的只能叠在大的上面,把所有碟子从A柱全部移到C柱上。

我从非常直观的角度,配合示意图来逐步分解,解释一下汉诺塔的python递归程序到底是怎

么运行的。

先说几个理解上的关键点【非常关键】:

(1)递归,说白了就是不考虑具体的实现细节,默认定义的函数可以实现想要的功能,然后

不断去调用这个函数,可以类比高中时的数学归纳法来理解,只不过归纳法是从小到大,而递

归是由大到小。

(2)对前n-1个圆盘进行操作时,最底下的第n个圆盘可以视作地面,因为第n个圆盘比前n-1

个圆盘都大。同理,要移动前n-2个圆盘时,那么第n-1,n个圆盘可以视作地面。

(3)对于函数move(n,A,B,C),里面的参数A,B,C是变量,它们的名称是什么不重要,

如下图所示,不变的是参数所对应的位置。

准确的说,move()函数的格式应该是:move(n,位置1,位置2,位置3)。

比如:move(n,A,B,C)表示把n个盘子从第一个位置参数所对应的柱子移动到第三个位置

参数所对应的柱子。同理,那么move(n,B,A,C)就表示n个圆盘从B柱移动到C柱。

下面我们来看python程序:

定义的函数为move(n,A,B,C),我们默认这个函数可以实现“把全部n个圆盘从A柱移动到C

柱”这一操作。然后由n逆推上一步(即如何把底部最大的盘子由A柱移动到C柱),注意这里

的上一步不是指具体的上一步,而是具有整体性的泛泛而谈的上一步。起始状态把前n-1个盘子从A柱移动到B柱上,对应函数move(n-1,A,C,B)把A柱最底层的第n个盘子移动到目标柱子:C柱把B柱上的前n-1个盘子移动到C柱,对应函数move(n-1,B,A,C)

这里肯定有人会疑惑,“把B柱上的前n-1个盘子整体移动到C柱”这个操作是如何做到的?

我们先回到定义的函数move(n,A,B,C),这个函数可以实现“把全部n个圆盘从A柱移动到C

柱”这一操作,我们先不管它具体是如何做到的,只是定义这个move()函数对应这个操

作,并假定这个操作一定可以实现。

那么上面的Step1“把前n-1个盘子从A柱移动到B柱上”,用函数来表示就是move(n-

1,A,C,B)。Step1完成后A柱第n个盘子上面就没有盘子了,这时Step2就可以把A柱底部的第n

个盘子(最大的盘子)移动到最终的目标柱C柱。

接下来Step3“把B柱上的前n-1个盘子移动到C柱”,用函数来表示就是move(n-1,B,A,C)。至此,从整体上来看,这个移动就完成了。

接下来具体解释一下这个递归程序到底是如何运行的:

n=1的情形很好理解,直接把这一个盘子从A柱移动到C柱就可以了。

n>1时,程序首先执行else里的第一个函数move(n-1,A,C,B)。①我们来看move(n-1,A,C,B)

是如何执行的呢:

再来回顾一下开头所提到的关键点:

即在一开始定义的move()函数框架下,当执行函数move(n-1,A,C,B)时,确实可以实现“把前n-1个盘子从A柱移动到B柱上”这一操作。

②对于函数move(n-1,A,C,B),假如n-1>1,依然要首先执行else分支里的第一个函数

move(n-2,A,B,C)。

......

③以此类推,直到到了n-k=1,即move函数中表示盘子数量的那个参数为1,这时程序开始执

行真正意义的第一步操作print(A,'--->',C),但要注意,这里的A和C只代表把move()函数

中第一个位置参数所对应的柱子上的盘子移动到第三个位置参数所对应的柱子上的盘子,假如

函数是move(1,B,A,C),那么则为print(B,'--->',C),假如函数是move(1,B,C,A),那么则为print(B,'--->',A)。

④move(1,位置1,位置2,位置3)的执行步骤已经知道了,那么move(2,位置1,位置

2,位置3)的执行步骤也就已知了,以move(2,A,B,C)举例[注:实际运行时move()函数

的位置1,2,3到底对应哪根柱子,程序会自己计算)],move(2,A,B,C)程序为:

到这里,move(2,位置1,位置2,位置3)的具体执行步骤已经知道了。

⑤同样的道理,move(3,位置1,位置2,位置3)乃至move(n-1,位置1,位置2,位置

3)的执行步骤就都是已知的了。这时我们来看最初的程序:

else分支下的move(n-1,A,C,B)和move(n-1,B,A,C)函数的具体执行步骤就都是已知的了。

至此,move (n,A,B,C)的整个执行步骤就很清晰了。

假如仍有疑惑,欢迎留言交流。

python汉诺塔递归算法流程图_详解汉诺塔Python递归程序相关推荐

  1. python获取mysql中的数据供js调用_详解js文件通过python访问数据库方法

    我来教你 js文件怎么通过python访问数据库,希望能够为你带来帮助. 1.如果是要提交表单内容给 服务器的 python 处理,那么只需要在表单 里面的 action 填写服务端的处理路由就可以了 ...

  2. python中list[1啥意思_详解Python中list[::-1]的几种用法

    本文主要介绍了Python中list[::-1]的几种用法,分享给大家,具体如下: s = "abcde" list的[]中有三个参数,用冒号分割 list[param1:para ...

  3. python爬取小说出现乱码_详解Python解决抓取内容乱码问题(decode和encode解码)

    一.乱码问题描述 经常在爬虫或者一些操作的时候,经常会出现中文乱码等问题,如下 原因是源网页编码和爬取下来后的编码格式不一致 二.利用encode与decode解决乱码问题 字符串在Python内部的 ...

  4. python调用cmd命令释放端口_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  5. python怎么画参数函数图像_详解pandas.DataFrame.plot() 画图函数

    首先看官网的DataFrame.plot( )函数 DataFrame.plot(x=None, y=None, kind='line', ax=None, subplots=False, share ...

  6. python中有那几种赋值_详解Python列表赋值复制深拷贝及5种浅拷贝

    概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅拷贝.深拷贝等绕口的名词到底有什么区别和作用呢? 列表赋值 # 定义一个新 ...

  7. python正则匹配空格+数字+空格_详解Python中正则匹配TAB及空格的小技巧

    详解Python中正则匹配TAB及空格的小技巧 发布时间:2020-10-15 08:38:48 来源:脚本之家 阅读:94 作者:杰瑞26 在正则中,使用.*可以匹配所有字符,其中.代表除\n外的任 ...

  8. python中yaml模块的使用_详解Python yaml模块

    一.yaml文件介绍 yaml是一个专门用来写配置文件的语言. 1. yaml文件规则 区分大小写: 使用缩进表示层级关系: 使用空格键缩进,而非Tab键缩进 缩进的空格数目不固定,只需要相同层级的元 ...

  9. python爬取微博恶评_详解用python写网络爬虫-爬取新浪微博评论

    新浪微博需要登录才能爬取,这里使用m.weibo.cn这个移动端网站即可实现简化操作,用这个访问可以直接得到的微博id. 分析新浪微博的评论获取方式得知,其采用动态加载.所以使用json模块解析jso ...

最新文章

  1. git没有changId解决方法
  2. linux ant脚本,linux下ant jmeter自动化测试
  3. 软件项目经理怎么做?
  4. 现代软件工程 第一周博客作业
  5. Django自定义过滤器
  6. Bulk Insert命令详解
  7. 使用FusionChartsFree整合项目
  8. 【转】工业物联网技术(IIoT)的技术与挑战(PPT全文)
  9. 设置MyEclipse2015黑色主题背景及删除主题
  10. 直流斩波电路在matlab中的建模与仿真,毕业设计直流斩波电路的MATLAB建模与仿真...
  11. uni-app 前后端实战课 - 《悦读》学习笔记:【创建项目、后端环境介绍】小程序开发实例教程1/
  12. uniapp使用uni-ui插件的方式
  13. docker安装xware 实现迅雷远程下载
  14. Python入门习题大全——数字 8
  15. Autodesk 专用安装检查和卸载程序
  16. Word设置每章不同的页眉
  17. java memorycache原理_CPU Cache 原理及操作
  18. Github配置ssh key【不用密码访问Github上代码】
  19. 如何使用Mac的媒体键在DisplayPort,HDMI或Thunderbolt监视器上调整扬声器音量
  20. 小啊呜产品读书笔记001:《邱岳的产品手记-13》第24讲 产品案例分析:PathSource的混乱与直观 25讲 产品世界的暗黑模式:操纵的诱惑

热门文章

  1. 苹果6可以分屏吗_可以找苹果企业签名中间商做苹果企业签名吗?
  2. 开一家“蜜雪冰城”店,38万够吗?
  3. Spring Cloud学习1
  4. ipad和iphone适配_如何将应用程序和游戏还原到iPhone或iPad
  5. 扫地机器人采用航顺芯片的应用经验,航顺MCU32位主控HK32F103VET6
  6. Esxi 6,7,8,将USB键盘鼠标直通到虚拟机
  7. 敏思跃动大数据教育规划平台正式上线,科技赋能树立业界新标杆
  8. 立方体,生成6个面,修改透视、俯视角度
  9. Java JDK API文档下载
  10. voip技术 G7.11