汉诺塔递归算法&分析过程

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

不管这个传说的可信度有多大,如果考虑一下把64片黄金圆盘,由一根柱子上移到另一根柱子上,并且始终保持上小下大的顺序。这需要多少次移动呢?。1个的时候当然是1次,2个的时候是3次,3个的时候就用了7次......这实在是太累了。这里需要递归的方法。假设有n片,移动次数是f(n).显然

f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2f(k)+1。此后不难证明f(n)=2^n-1。

n=64时,

假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下:

18446744073709551615秒

这表明移完这些黄金圆盘需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

汉诺塔问题在数学界有很高的研究价值,而且至今还在被一些数学家们所研究,也是我们所喜欢玩的一种益智游戏,它可以帮助开发智力,激发我们的思维。

之前看到了一段经典的递归代码,简简单单几行代码就解决了深奥的问题,为什么那几行代码就把汉诺塔问题给解了呢?

代码如下:

看到这个程序 ,难理解的就是下面两句:

move(n-1, a, c, b)

move(n-1, b, a, c)

我们知道它用了递归,第一句把第一个位置的盘移到第二个位置,第二句再把第二个移到第三个位置。 但为什么这样就可以递归出答案呢?

这个可以用二叉树解释。下面看一个图估计你就会知道了。

这是一个递归的图解,根结点是第一次进入move函数,第一个参数3只要大于1就往下推,第二个参数是指要移动的盘的原始位置,第四个参数是指要移动到的目的位置,第三个参数中转,下一次递归时准备的一个参数。这个图是按照程序画出来的,上面的节点个数就是调用move函数的次数。现在我们来中序遍历这棵二叉树。

假设:开始时a,b,c三个盘都放在one上,从a到c依次增大,就是说c放在最下面,a在最上面,-> 表示移动。

节点4:a -> z

节点2:b -> y

节点5:a -> y

节点1:c -> z

节点6:a -> x

节点3:b -> z

节点7:a -> z

完成。

假设有4个盘呢?那也是一样的道理可以推出。这时就有15个节点,就是说要移动15次。那有n个盘呢?2的n次方减1……

汉诺塔递归算法python详细解析图_汉诺塔递归算法分析过程相关推荐

  1. python代码做图_如何用Python代码制作图

    Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的.大型项目的开发. 图是一 ...

  2. python可以p图_用Python来P图!简直耍开PS几条街!

    写在前面 PS作为世界四大发明之一可以说被广大网友用到了极致,只有你想不到的没有我P不了的,任何正经的图片在都可以变成搞笑图片(比如下图)当然也可以用ps做一点正经的事情. 作为一个爱折腾的程序猿能用 ...

  3. python画平行坐标图_[宜配屋]听图阁

    平行坐标图,一种数据可视化的方式.以多个垂直平行的坐标轴表示多个维度,以维度上的刻度表示在该属性上对应值,相连而得的一个折线表示一个样本,以不同颜色区分类别. 但是很可惜,才疏学浅,没办法在Pytho ...

  4. python画漏斗图_只需简单几步,教你用python完成漏斗图的绘制

    商业分析中经常会用到漏斗图.尤其是在网站流量监控.电商商品转化等一些数据运营方面.漏斗图之所以是漏斗就就是倒三角的形状,是因为用户或者流量,集中从某个功能点进入,很大可能会按照产品本身设定的流程来完成 ...

  5. 汉仪尚巍手书有版权吗_汉仪尚巍手书字体下载 汉仪尚巍手书体W字体免费版下载...

    手写书法字体小编已经发布过很多了,今天发布的这款汉仪尚巍手书字体是由汉仪字库出品的一套手写书法字体,比较完整,个人使用免费,如果用于商业用途需要联系汉仪官方获取授权,适用于标题.印刷.包装.电商使用. ...

  6. 汉诺塔递归算法 python实现

    数据结构复习内容--栈的应用 汉诺塔 def hannuota(n:int,a:str,b:str,c:str):if n==1:print(a,"--->",c)else: ...

  7. 力扣-第104题--二叉树的最大深度(python)--详细解析--逐步调试

    给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 递归法: 解题思路: 1.首先判断根目录是否为空节点,如果是,返回0 ...

  8. python时间序列动图_手把手教你用Python进行时间序列分解和预测

    来源:数据派THU(ID:DatapiTHU) ▔ 作者:Mohit Sharma 翻译:王闯(Chuck) 校对:王可汗 预测是一件复杂的事情,在这方面做得好的企业会在同行业中出类拔萃.时间序列预测 ...

  9. python导出dxf图_在PDMS中使用python直接生成管口方位图(开源分享第三集)

    在PDMS中使用python直接生成管口方位图(开源分享第三集) 距离上一次发推送已有5个月之久,上周立了冬,这二季我为五斗米折了腰,最近才缓过气来. 令我没想到的是,大家竟然对这个主题这么有兴趣,有 ...

  10. python神经网络构建图_如何用卷积神经网络构建图像?

    原标题:如何用卷积神经网络构建图像? 原标题 |Everything you need to know to master Convolutional Neural Networks 作者 | Tir ...

最新文章

  1. php-fpm backlog 项的调整
  2. 数据库:跨数据库,服务器数据迁移
  3. MyBatis Review——一对多关系映射配置
  4. 【nginx】nginx的工作模式和信号量控制
  5. python全局变量定义_python全局变量和局部变量的概念
  6. 希尔伯特空间(Hilbert空间)
  7. 湖北武汉电信及全国DNS分析(湖北的DNS已验证)
  8. 数据库实体间一对多(多对一)、多对多关系处理
  9. ICTCLAS 汉语词性标注
  10. 最全面的Microsoft Office下载
  11. BZOJ 3097: Hash Killer I【构造题,思维题】
  12. my.cnf文件详解
  13. 乡村少年宫计算机教师简介,乡村少年宫教师感言
  14. 生活账本怎么记不会乱,用哪一记账工具才能让账目更清晰
  15. 外设驱动库开发笔记51:SDP800差压传感器驱动
  16. 全排列(下一个排列,算法)
  17. Coursera吴恩达机器学习week4笔记
  18. 红帽linux配置远程连接,CentOS服务器端配置SSH远程连接的教程
  19. 简单易懂的芯片科普漫画,帮你打开高深的新技术大门
  20. iPhone 4 无shsh 完美降级 iOS 6

热门文章

  1. 回收手机一般用什么软件测试,回收二手手机怎么进行硬件检测?
  2. java百度贴吧一键签到,手机百度贴吧怎么一键签到?手机贴吧一键签到怎么用?
  3. 福昕阅读器不能完全显示整个页面的解决办法
  4. 在线古诗自动生成器的设计与实现
  5. vue项目打包部署到服务器子目录二级目录。
  6. Mac OS系统下kernel_task占用大量CPU资源导致系统卡顿
  7. 总管家云CRM:客户不跟踪,销售一场空
  8. dell-xps-8930 台式机双硬盘 双系统安装 win10+Ubuntu
  9. 云服务器温控系统,服务器cpu温度监控软件
  10. 终于能在Linux下用firefox使用支付宝了!!!