前情提要:

首先说一下汉诺塔游戏的规则:如下图所示,有三个柱子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

对汉诺塔递归算法的理解(图解,附完整代码实现)相关推荐

  1. 汉诺塔-递归算法深入理解

    汉诺塔算法就3个步骤: 第一,把a上的n-1个盘通过c移动到b: 第二,把a上的最下面的盘移到c: 第三,因为n-1个盘全在b上了. 所以把b当做a重复以上步骤就好了.不过,思考过程还是很痛苦的,难以 ...

  2. 汉诺塔递归算法进阶_进阶python 1递归

    汉诺塔递归算法进阶 When something is specified in terms of itself, it is called recursion. The recursion give ...

  3. python汉诺塔_汉诺塔递归算法/搬金盘的婆罗门 - Python实现

    汉诺塔递归算法/搬金盘的婆罗门 - Python实现 版权声明 本文节选自作者本人的图书<Python编程基础及应用>,高等教育出版社.本文可以在互联网上自由转载,但必须:注明出处(作者: ...

  4. 汉诺塔递归算法/搬金盘的婆罗门 - Python实现

    汉诺塔递归算法/搬金盘的婆罗门 - Python实现 本文引用自作者编写的下述图书; 本文允许以个人学习.教学等目的引用.讲授或转载,但需要注明原作者"海洋饼干叔 叔":本文不允许 ...

  5. python汉诺塔递归算法流程图_python实现汉诺塔的图解递归算法

    一.起源: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小 ...

  6. 汉诺塔递归算法理解及实现

    汉诺塔问题描述: A.B.C 三个桌子,其中A桌子上放了几个大小不同的盘子,盘子的排列顺序为: 从上到下,依次从小到大递增:现要求把这些盘子从 A 桌子上移动到 C 桌子上,盘子移动时有一点要求:每次 ...

  7. python汉诺塔递归算法流程图,python实现汉诺塔递归算法经典案例

    Python汉诺塔递归问题 python请用递归算法编程解决汉诺塔问题 在线等 关于python递归函数实现汉诺塔 def move(n,a,b,c): #1 if n==1: #2 print(a, ...

  8. 我对汉诺塔问题的理解

    1.代码的实现   这一段代码非常简单,网上一大堆.但真正理解起来,却没这么简单.所以接下来我想以我的方式,解释一下分治的过程. 2.问题重述   假设现在一共有 n n n个圆盘在圆柱 A A A上 ...

  9. python汉诺塔递归算法流程图_详解汉诺塔Python递归程序

    学习递归时,很多小伙伴对汉诺塔的递归算法非常疑惑,不清楚那么复杂的移动过程,为何用四五行代码就给解决了.汉诺塔问题:有三根柱子A,B,C.A柱上有若干碟子,每次移动一块碟子,小的只能叠在大的上面,把所 ...

最新文章

  1. CSDN线上直播操作测试方案
  2. svn 不支持http 客户端_Xversion for mac(SVN客户端)
  3. python抽奖游戏大全_抽奖游戏
  4. android 音频设备类型,实现车载音频 HAL  |  Android 开源项目  |  Android Open Source Project...
  5. 自己动手一步步安装Linux系统
  6. 二、SSD网络原理及代码讲解
  7. 知其然(1) 无法使用 DISTINCT, GROUP BY 等子句从视图中选择 ROWID 或采样
  8. android百度地图定位文字表述,Android studio 百度地图开发(8)地图已标记POI点和搜索POI点的获取和利用...
  9. 肖 sir_就业课__011性能测试讲解
  10. 计算机应用简答,计算机应用基础简答题.doc
  11. 打印表格留标题怎么设置_表格打印怎么保留标题!EXCEL打印如何设置每页都显示标题栏...
  12. 2017字节跳动前端工程师秋招笔试试题解析
  13. 【C进阶】qsort函数详解
  14. 基于Java+Swing实现雷电小游戏
  15. 黑群晖升级后无法找到的方法
  16. 打击恶意逃废债 捞财宝响应互金整治办报送“老赖”信息
  17. map容器/multimap容器
  18. 爬虫,爬虫,爬爬爬爬爬爬爬爬
  19. 微信小程序入门-随机人脸生成
  20. Java随机生成四位数字(四位整数)Random类

热门文章

  1. TQ210——S5PV210串口通信
  2. MFC CStringArray 字符串数组类 使用方法
  3. OCR系列——总体概述
  4. 七、Web服务器——Junit单元测试 反射 注解学习笔记
  5. 八、一篇文章快速搞懂MySQL 常见的数据类型(整型、小数、字符型、日期型详解)
  6. LeetCode 2018. 判断单词是否能放入填字游戏内(模拟)
  7. LeetCode 1619. 删除某些元素后的数组均值
  8. LeetCode 336. 回文对(哈希map/Trie树)
  9. LeetCode 455. 分发饼干(贪心)
  10. 在android添加数据采集,一种基于Android系统的地理信息数据采集方法与流程