来源

汉诺塔是来源于印度的一种古老的益智游戏。它总共有三根柱子,分别为A,B,C。初始状态下,A柱中有N个盘子,这N个盘子有大有小,大的在下面,小的在上面。游戏的最终目标就是将A柱上的所有盘子移到C柱上,中间可以经过B柱,过程中必须保持大盘在下面,小盘在上面。如图所示:

算法引申

在这个题目中,我们把关注点投向最优解实现:需要用最少的步骤完成游戏,移动的过程是怎么样的。

现在让我们在脑海中想一下自己操作的时候会怎么做?先来定义一下每根柱上的实时数目{A:N, B:0, C:0}

我们要把A柱上的N个盘移到C柱,就要先把A柱上面的N-1个盘移到B柱上,此时A柱上只有一个,状态是{A:1, B:N-1, C:0},移动最A中仅有的那个盘到C,状态是{A:0, B:N-1, C:1},此时,我们再把B中N-1个盘移动到C,状态是{A:0, B:0, C:N}

将n个盘的移动操作记为F(n),整理一下操作步骤:

1. A移动N-1个盘到B: F(n-1);

2. A移动最大盘到C: F(1)即为1;

3. B移动N-1个盘到C: F(n-1);

于是我们可以得到等式:

F(n)=F(n-1)+F(1)+F(n-1)=2*f(n-1)+1

通过数学归纳法可以得到F(n)= 2^n+1

至此,我们解决了第一个问题,通过 (2^n+1) 次移动,可以完成游戏。

那么移动的过程是怎样的呢?

汉诺塔的移动只需要三步,前面已经分析过了,可以看出这是一个典型的递归函数,我们可以打印出移动的步骤:

python解法

# 汉诺塔移动,把n个盘将a移到c,途中经转b

def move(n, a, b, c):

if n == 1:

print('move', a, '-->', c) #根部迭代,一次情况下,直接 a --> c 移动

return

move(n-1, a, c, b) #把a中的n-1个盘移动到b,途中经转c

print('move', a, '-->', c) #把a中的1个盘移动到c

move(n-1, b, a, c) #把b中的n-1个盘移动到c,途中经转a

move(4, 'A', 'B', 'C')

我们用python定义了一个move函数,它的第一个参数为需要移动的个数n,第二个参数为出发柱a,第三个参数为中转柱b,第三个参数为目标柱c,完成的操作是从出发柱移动了n个盘子到目标柱

运行结果

汉诺塔的讲解到这里应该也比较清晰了,本质就是递归调用,最重要的一点是

汉诺塔的移动只需要三步

汉诺塔python执行流程_hannoi塔(汉诺塔)移动过程解析相关推荐

  1. python语音合成实现原理_python腾讯语音合成实现过程解析

    一.腾讯语音合成介绍 腾讯云语音合成技术(TTS)可以将任意文本转化为语音,实现让机器和应用张口说话. 腾讯TTS技术可以应用到很多场景,比如,移动APP语音播报新闻:智能设备语音提醒:依靠网上现有节 ...

  2. 汉诺塔python代码解释_python实现汉诺塔算法

    题目: 汉诺塔给出最优解,如果对汉诺塔的定义有不了解,请翻看数据结构教材. 除了最基本的之外,还有一题,给定一个数组,arr=[2,3,1,2,3],其含义是这是一个有5个圆盘的汉诺塔,每一个数字代表 ...

  3. python画代码流程图_Python使用graphviz画流程图过程解析

    问题描述 项目中需要用到流程图,如果用js的echarts处理,不同层级建动态计算位置比较复杂,考虑用python来实现 测试demo 实现效果如下 完整代码 import yaml import o ...

  4. python test suite什么意思_Python TestSuite生成测试报告过程解析

    简介:为每一个测试用例添加说明,那么将会使报告更加易读懂,工作中汇报数据的技巧 u"test_one方法" htmltestrunner 是 python 标准库的 unittes ...

  5. python mysql 基于 sqlalvhrmy_Python基于DB-API操作MySQL数据库过程解析

    Python提供了一个标准数据库API,称为DB-API,用于处理基于SQL的数据库. 与任何底层数据库的交互都可以使用DB-API,因为DB-API在代码与驱动程序之间提供了一个抽象层,可以根据需要 ...

  6. python execjs详解_Python基于execjs运行js过程解析

    execjs 使用 有了selenium+Chrome Headless 加载页面为什么还要用execjs来运行js? selenium+Chrome Headless 必然是爬虫的一大利器,可是缺点 ...

  7. Android系统启动流程(一) init进程启动过程解析

    init进程是Android系统第一个用户态的进程,init被赋予了很多重要的职责,比如我们熟悉的Zygote孵化器进程就是由init进程启动的.今天我们就来分析init进程的启动过程. 1 init ...

  8. Android系统启动流程(四)Launcher进程启动过程解析(附带面试题)

    前面我们分析了init进程,zygote进程,SystemServer进程,本篇的Launcher是系统启动流程的最后一个进程. 1 Launcher概述 Launcher进程是一个系统的应用程序,位 ...

  9. python xlutils教程_Python基于xlutils修改表格内容过程解析

    一.xlutils是什么 是一个提供了许多操作修改excel文件方法的库: 属于python的第三方模块 xlrd库用于读取excel文件中的数据,xlwt库用于将数据写入excel文件,修改用xlu ...

最新文章

  1. Blockchain与Big Data将碰撞出怎样的火花?
  2. Science组合图表解读
  3. 自写sonar 插件加载到sonar 服务中的展示信息
  4. 计算机一级考试有三科,全国计算机一级考试是一级WPS Office 一级MS Office 一级Photoshop 三个任选一个考试吗?...
  5. 06jQuery-04-DOM操作
  6. 面试官问:能否模拟实现JS的call和apply方法
  7. NewServlet ‘***Servlet‘ already exists inthis Web facet.
  8. linux中如何查看某个端口是否被占用,LINUX中如何查看某个端口是否被占用
  9. MFC中Combo 下来菜单不能展开(只显示一点点)
  10. 我爱我家:旗下APP已全面兼容鸿蒙系统
  11. springboot集成mybati 后又使用mybatisPlus 出现的问题 BindingException:Invalid bound statement
  12. sql server 排名函数:DENSE_RANK
  13. 计算机操作系统的基本概念
  14. 中标麒麟 V7 操作系统安装达梦数据库 DM8
  15. Android开发笔记——视频录制播放常见问题
  16. 小书匠配置github图床服务(详细版)
  17. java抢红包并发问题,Redis乐观锁解决高并发抢红包的问题【redis】
  18. Windows Sockets概述
  19. 读取海康威视摄像头实时显示视频流
  20. 如何判断对象是否是垃圾

热门文章

  1. skywalking 安装_分布式监控系统SkyWalking
  2. javascript之数组(二)
  3. ajax上传json到服务器
  4. win10下zookeeper的下载以及安装
  5. 应用发布服务器_Apache Tomcat 10.0.0-M1 发布,开源 Web 应用服务器
  6. android小米通知不显示电量,Android开发笔记——小米通知‘坑’ app的通知一直显示在不重要通知里 ......
  7. oracle 日期 加一秒,Leap Second (闰秒) 在ORACLE环境的影响
  8. 如何让vim支持python_无法使vim支持python
  9. Leecode刷题热题HOT100(13)——罗马数字转整数
  10. 手动迁移KVM虚拟机