来源

汉诺塔是来源于印度的一种古老的益智游戏。它总共有三根柱子,分别为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 移动 returnmove(n-1, a, c, b)              #把a中的n-1个盘移动到b,途中经转cprint('move', a, '-->', c)      #把a中的1个盘移动到cmove(n-1, b, a, c)              #把b中的n-1个盘移动到c,途中经转amove(4, 'A', 'B', 'C')


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

运行结果

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

汉诺塔的移动只需要三步

hannoi塔(汉诺塔)移动过程解析相关推荐

  1. 小知识系列(3):Hanoi塔(汉诺塔,河内塔)

    同样,借此来强化学习,但是说实话我写这个感觉很玄.Hanoi塔是昨天刚学到的东西,想了很久,感觉还是没有悟透,可能学到更多新东西,或产生了新的想法,或突然悟到了什么,届时会再做修改. 看了很多关于Ha ...

  2. 具体数学 递归问题1.1 从河内塔/汉诺塔开始

    河内塔问题 在经典河内塔问题中,有3根柱子和N个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子.一开始,所有盘子自上而下按从大到小依次套在一根柱子上,现在想将所有的圆盘按照原来的位置从一根柱子移动到另一 ...

  3. [河内塔]汉诺塔实现

    function hanoi (n, from, to, spare) {if(n == 1) {console.log(`${from} => ${to}`) }else {hanoi(n-1 ...

  4. python面向过程实践汉诺塔_递归汉诺塔-和递归汉诺塔相关的内容-阿里云开发者社区...

    多柱汉诺塔最优算法设计探究 多柱汉诺塔最优算法设计探究 引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究.最简单的汉诺塔是三个柱子(A.B.C),因 ...

  5. 汉诺塔问题详解 递归实现 C语言

    目录 一.前言 二.游戏规则 三.思路讲解 四.完整代码 五.最终结果展示 一.前言 汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,  其中一根柱子 ...

  6. 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)

    目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的 ...

  7. labview求n阶乘的和_递归算法(从阶乘、斐波那契到汉诺塔的递归图解)

    递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的. 对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作 ...

  8. python递归函数例子_Python递归函数经典案例-汉诺塔问题

    汉诺塔 汉诺塔问题是递归算法学习的一个经典案例,首先来看下汉诺塔问题的相关描述: 汉诺塔问题起源于一个古老的印度传说,大梵天创世时制作了三根金刚石石柱,在第一根柱子上从上往下从小到大摞着64片金盘,婆 ...

  9. 汉诺塔(hanoi)、双色汉诺塔(分离型)、三色汉诺塔

    汉诺塔 汉诺塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市:1883年法国数学家Edouard Luca ...

  10. 算法(9)汉诺塔图解及其代码实现

    写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...

最新文章

  1. gRPC:Google开源的基于HTTP/2和ProtoBuf的通用RPC框架
  2. 垃圾回收机制的优点和原理
  3. jdk开发文档_【第9期】面试官:JDK、JRE、JVM 三者什么关系?
  4. C#和.NET Framework的关系
  5. React Native - FlexBox弹性盒模型
  6. 面试(2)——StringBuffer StringBuilder String /==与equals
  7. 桌面时钟代码_被遗忘的手机桌面小部件
  8. nginx ngx_http_auth_basic_module(Basic Authentication)
  9. NVisionXR_iOS教程五 —— 添加灯光渲染
  10. Python把类当做字典来访问
  11. InstallShield Limited Edition Project 打包windows服务解析
  12. WebMvcConfigurerAdapter
  13. C++中二维数组的动态分配
  14. koa2+html模板,Koa2 路由
  15. autocad 如何摆正显示_CAD怎么调整坐标系显示?
  16. sql注入实验二 ——合天网安实验室学习笔记
  17. 贴片电阻封装规格及阻值标注方法
  18. HTML班级网页设计 基于HTML+CSS+JS制作我们的班级网页(web前端学生网页设计作品)
  19. 天善智能丨国产商业智能BI这20年(1997~2017)
  20. Unity Profiler

热门文章

  1. mysql的sleep线程多久_MySQL数据库sleep线程过多,怎么办?
  2. 重大问题思考-2021年总结
  3. 如何让开源多点成功的几率;开源和 COVID-19: 道高一尺魔高一丈;等开源之道每周评论2020 04 07...
  4. photoshop 重复上一次变换操作 ctrl+shift+alt+t
  5. 量子计算机与新南威尔士大学,新南威尔士大学声称量子计算的准确性
  6. 【hadoop生态之Hive】Hive的数据类型【笔记+代码】
  7. 硬笔书法的产生与兴起
  8. 【MATLAB】通信信号调制通用函数 — 傅里叶逆变换
  9. 齐齐哈尔鹤城计算机学校,齐齐哈尔阳光学校
  10. 亚马逊防关联怎么做?软关联硬关联有什么?