hannoi塔(汉诺塔)移动过程解析
来源
汉诺塔是来源于印度的一种古老的益智游戏。它总共有三根柱子,分别为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塔(汉诺塔)移动过程解析相关推荐
- 小知识系列(3):Hanoi塔(汉诺塔,河内塔)
同样,借此来强化学习,但是说实话我写这个感觉很玄.Hanoi塔是昨天刚学到的东西,想了很久,感觉还是没有悟透,可能学到更多新东西,或产生了新的想法,或突然悟到了什么,届时会再做修改. 看了很多关于Ha ...
- 具体数学 递归问题1.1 从河内塔/汉诺塔开始
河内塔问题 在经典河内塔问题中,有3根柱子和N个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子.一开始,所有盘子自上而下按从大到小依次套在一根柱子上,现在想将所有的圆盘按照原来的位置从一根柱子移动到另一 ...
- [河内塔]汉诺塔实现
function hanoi (n, from, to, spare) {if(n == 1) {console.log(`${from} => ${to}`) }else {hanoi(n-1 ...
- python面向过程实践汉诺塔_递归汉诺塔-和递归汉诺塔相关的内容-阿里云开发者社区...
多柱汉诺塔最优算法设计探究 多柱汉诺塔最优算法设计探究 引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究.最简单的汉诺塔是三个柱子(A.B.C),因 ...
- 汉诺塔问题详解 递归实现 C语言
目录 一.前言 二.游戏规则 三.思路讲解 四.完整代码 五.最终结果展示 一.前言 汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子, 其中一根柱子 ...
- 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的 ...
- labview求n阶乘的和_递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的. 对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作 ...
- python递归函数例子_Python递归函数经典案例-汉诺塔问题
汉诺塔 汉诺塔问题是递归算法学习的一个经典案例,首先来看下汉诺塔问题的相关描述: 汉诺塔问题起源于一个古老的印度传说,大梵天创世时制作了三根金刚石石柱,在第一根柱子上从上往下从小到大摞着64片金盘,婆 ...
- 汉诺塔(hanoi)、双色汉诺塔(分离型)、三色汉诺塔
汉诺塔 汉诺塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市:1883年法国数学家Edouard Luca ...
- 算法(9)汉诺塔图解及其代码实现
写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...
最新文章
- gRPC:Google开源的基于HTTP/2和ProtoBuf的通用RPC框架
- 垃圾回收机制的优点和原理
- jdk开发文档_【第9期】面试官:JDK、JRE、JVM 三者什么关系?
- C#和.NET Framework的关系
- React Native - FlexBox弹性盒模型
- 面试(2)——StringBuffer StringBuilder String /==与equals
- 桌面时钟代码_被遗忘的手机桌面小部件
- nginx ngx_http_auth_basic_module(Basic Authentication)
- NVisionXR_iOS教程五 —— 添加灯光渲染
- Python把类当做字典来访问
- InstallShield Limited Edition Project 打包windows服务解析
- WebMvcConfigurerAdapter
- C++中二维数组的动态分配
- koa2+html模板,Koa2 路由
- autocad 如何摆正显示_CAD怎么调整坐标系显示?
- sql注入实验二 ——合天网安实验室学习笔记
- 贴片电阻封装规格及阻值标注方法
- HTML班级网页设计 基于HTML+CSS+JS制作我们的班级网页(web前端学生网页设计作品)
- 天善智能丨国产商业智能BI这20年(1997~2017)
- Unity Profiler
热门文章
- mysql的sleep线程多久_MySQL数据库sleep线程过多,怎么办?
- 重大问题思考-2021年总结
- 如何让开源多点成功的几率;开源和 COVID-19: 道高一尺魔高一丈;等开源之道每周评论2020 04 07...
- photoshop 重复上一次变换操作 ctrl+shift+alt+t
- 量子计算机与新南威尔士大学,新南威尔士大学声称量子计算的准确性
- 【hadoop生态之Hive】Hive的数据类型【笔记+代码】
- 硬笔书法的产生与兴起
- 【MATLAB】通信信号调制通用函数 — 傅里叶逆变换
- 齐齐哈尔鹤城计算机学校,齐齐哈尔阳光学校
- 亚马逊防关联怎么做?软关联硬关联有什么?