对汉诺塔递归算法的理解(图解,附完整代码实现)
前情提要:
首先说一下汉诺塔游戏的规则:如下图所示,有三个柱子A,B,C,我们要做的是把A柱的所有圆盘,全部转移到C柱上,转移时遵循的规则如下:
1、每次只能移动一个圆盘
2、所有的大圆盘必须在小圆盘的下面
过程分析
首先假设只有一个圆盘,我们将其编号为1,如下图所示,那么这时候只需要将A直接移到C即可:
再假设有两个圆盘,我们看到移动过程如下:
步骤1:先将1号盘从A移动到B;
步骤2:再将2号盘从A移动到C;
步骤3:最后将1号盘从B移动到C,完成转移。
好了,请读者有点耐心,我们再看看三个圆盘的转移过程是怎样进行的:(此处用文字进行描述,请读者发挥想象)
首先三个圆盘放在A柱上,按从上到下的顺序依次编号为1,2,3(最小的为1,最大的为3),我们先不考虑3号盘,而只考虑上面两个小一点的圆盘(编号1,2),而此前我们已经分析了两个圆盘的移动过程,那么这两个圆盘该移动到哪根柱子呢?目前只有B柱,C柱可选,而C柱肯定不行,因为C柱是目标柱,那么我们只能把1,2号盘从A柱移动到B柱,借助C柱,则移动过程为:A->C, A->B,C->B。此时,1,2号盘已经到达B柱,再把最大的三号盘,直接移到C柱。此时工作快要完成了,目前的状态为:1,2号盘在B柱,3号盘已到达目的柱C柱,再接下来,把1,2号盘将B柱移动到C柱,转移工作就彻底结束,借助A柱,转移过程为:B->A,B->C,A->C。
通过上面第一段加红的文字,我们可以知道,A是作为起始柱,B作为目标柱,C作为辅助柱,通过第二段加红文字,我们可以知道,B是作为起始柱,A作为辅助柱,C作为目标柱。
那么此时,函数的写法,在脑海里大概就有了形状
函数定义
根据上面的分析,我们知道,函数的参数,有盘子,A,B,C三个柱子,所以,函数的签名为:move(n, a, b, c)。其中n表示圆盘的个数,a表示起始柱,b表示辅助柱,c表示目标柱。
根据上面对三个圆盘的分析,可得函数定义如下(Python代码):
1 def move(n, a, b, c): 2 if n == 1: 3 print a + '-->' + c 4 return 5 move(n - 1, a, c, b) 6 print a + '-->' + c 7 move(n - 1, b, a, c)
代码解释:
当n=1时,即当只有一个圆盘时,直接输出a -> c,即将圆盘从A移动到C(对应第2,3行代码)
当n>1时,就先处理前n-1个圆盘,将前n-1个圆盘从a移动到b柱,借助c柱(对应第5行代码),然后将第n个圆盘从a柱移动到c柱(对应代码第6行),最后将剩下的n-1个圆盘,将b柱移动到c柱,借助a柱(递归思想,请读者联合上面对三个圆盘的分析仔细斟酌)
调用代码如下:(4个圆盘)
1 move(4, 'A', 'B', 'C')
结果如下:
A-->B A-->C B-->C A-->B C-->A C-->B A-->B A-->C B-->C B-->A C-->A B-->C A-->B A-->C B-->C
转载于:https://www.cnblogs.com/HeZhengfa/p/10245109.html
对汉诺塔递归算法的理解(图解,附完整代码实现)相关推荐
- 汉诺塔-递归算法深入理解
汉诺塔算法就3个步骤: 第一,把a上的n-1个盘通过c移动到b: 第二,把a上的最下面的盘移到c: 第三,因为n-1个盘全在b上了. 所以把b当做a重复以上步骤就好了.不过,思考过程还是很痛苦的,难以 ...
- 汉诺塔递归算法进阶_进阶python 1递归
汉诺塔递归算法进阶 When something is specified in terms of itself, it is called recursion. The recursion give ...
- python汉诺塔_汉诺塔递归算法/搬金盘的婆罗门 - Python实现
汉诺塔递归算法/搬金盘的婆罗门 - Python实现 版权声明 本文节选自作者本人的图书<Python编程基础及应用>,高等教育出版社.本文可以在互联网上自由转载,但必须:注明出处(作者: ...
- 汉诺塔递归算法/搬金盘的婆罗门 - Python实现
汉诺塔递归算法/搬金盘的婆罗门 - Python实现 本文引用自作者编写的下述图书; 本文允许以个人学习.教学等目的引用.讲授或转载,但需要注明原作者"海洋饼干叔 叔":本文不允许 ...
- python汉诺塔递归算法流程图_python实现汉诺塔的图解递归算法
一.起源: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小 ...
- 汉诺塔递归算法理解及实现
汉诺塔问题描述: A.B.C 三个桌子,其中A桌子上放了几个大小不同的盘子,盘子的排列顺序为: 从上到下,依次从小到大递增:现要求把这些盘子从 A 桌子上移动到 C 桌子上,盘子移动时有一点要求:每次 ...
- python汉诺塔递归算法流程图,python实现汉诺塔递归算法经典案例
Python汉诺塔递归问题 python请用递归算法编程解决汉诺塔问题 在线等 关于python递归函数实现汉诺塔 def move(n,a,b,c): #1 if n==1: #2 print(a, ...
- 我对汉诺塔问题的理解
1.代码的实现 这一段代码非常简单,网上一大堆.但真正理解起来,却没这么简单.所以接下来我想以我的方式,解释一下分治的过程. 2.问题重述 假设现在一共有 n n n个圆盘在圆柱 A A A上 ...
- python汉诺塔递归算法流程图_详解汉诺塔Python递归程序
学习递归时,很多小伙伴对汉诺塔的递归算法非常疑惑,不清楚那么复杂的移动过程,为何用四五行代码就给解决了.汉诺塔问题:有三根柱子A,B,C.A柱上有若干碟子,每次移动一块碟子,小的只能叠在大的上面,把所 ...
最新文章
- CSDN线上直播操作测试方案
- svn 不支持http 客户端_Xversion for mac(SVN客户端)
- python抽奖游戏大全_抽奖游戏
- android 音频设备类型,实现车载音频 HAL | Android 开源项目 | Android Open Source Project...
- 自己动手一步步安装Linux系统
- 二、SSD网络原理及代码讲解
- 知其然(1) 无法使用 DISTINCT, GROUP BY 等子句从视图中选择 ROWID 或采样
- android百度地图定位文字表述,Android studio 百度地图开发(8)地图已标记POI点和搜索POI点的获取和利用...
- 肖 sir_就业课__011性能测试讲解
- 计算机应用简答,计算机应用基础简答题.doc
- 打印表格留标题怎么设置_表格打印怎么保留标题!EXCEL打印如何设置每页都显示标题栏...
- 2017字节跳动前端工程师秋招笔试试题解析
- 【C进阶】qsort函数详解
- 基于Java+Swing实现雷电小游戏
- 黑群晖升级后无法找到的方法
- 打击恶意逃废债 捞财宝响应互金整治办报送“老赖”信息
- map容器/multimap容器
- 爬虫,爬虫,爬爬爬爬爬爬爬爬
- 微信小程序入门-随机人脸生成
- Java随机生成四位数字(四位整数)Random类
热门文章
- TQ210——S5PV210串口通信
- MFC CStringArray 字符串数组类 使用方法
- OCR系列——总体概述
- 七、Web服务器——Junit单元测试 反射 注解学习笔记
- 八、一篇文章快速搞懂MySQL 常见的数据类型(整型、小数、字符型、日期型详解)
- LeetCode 2018. 判断单词是否能放入填字游戏内(模拟)
- LeetCode 1619. 删除某些元素后的数组均值
- LeetCode 336. 回文对(哈希map/Trie树)
- LeetCode 455. 分发饼干(贪心)
- 在android添加数据采集,一种基于Android系统的地理信息数据采集方法与流程