汉诺塔是什么?

汉诺塔问题就是将A柱上n个圆全部移动到C上,过程中可以借助B柱,但要始终保持小圆在大圆上面。

1.自顶向下 逐步求精

“自顶向下, 逐步求精”是一种结构化程序设计常见的思路。
“自顶向下”是将复杂、大的问题划分为小问题,找出问题的关键、重点所在,然后用精确的思维定性、定量地去描述问题。
“逐步求精” 是将现实世界的问题经抽象转化为逻辑空间或求解空间的问题。复杂问题经抽象化处理变为相对比较简单的问题。经若干步抽象(精化)处理,最后到求解域中只是比较简单的编程问题。

在汉诺塔问题中就要用到自顶向下 逐步求精的思想。首先,我们要将最上面的圆盘移动到第三个柱子上,然后将剩余的圆盘移动到第二个柱子上,最后将最上面的圆盘移动到第二个柱子上上。因此,这个问题可以分解为三个子问题,即将n-1个圆盘从第一个柱子上移动到第二个柱子,将第n个圆盘从第一个柱子移动到第三个柱子,再将n-1个圆盘从第二个柱子移动到第三个柱子,这三个字问题分别递归解决。

2.函数调用,递归

解决汉诺塔问题,我们需要用到函数的调用,递归,分治。我们编写一个函数hanoi(n,a,b,c),n则表示要移动的圆盘数,a,b,c表示三个柱子。在函数中,先检查n的值,若n==1,可以将圆盘a直接移到柱子c:否则,该函数会将问题分解为三个子问题,并且用递归函数解决问题。

3.形参与实参:

在汉诺塔问题中,形参是n,a,b和c分别表示要移动的圆盘数和三个柱子,函数调用是我们需要给圆盘数和三个柱子具体的名字。

4.标识符

使用有意义的标识符,如n,a,b,c和hanoi()可以更好地表达程序的含义,代码的可读性。

5.递归栈

使用递归栈来保存函数调用的状态。也就是说,在汉诺塔中,每个递归栈都会创建一个新的函数调用帧,将其送入递归栈中,当递归调用返回时,对应的函数调用帧会被弹出,返回上一层调用的状态。可知,递归栈的深度等于递归调用的层数n。

6.空间复杂度

在汉诺塔问题中空间复杂度为O(n),其中是圆盘的数量。因为我们需要一个递归栈来保存每个递归调用的状态。由于递归栈的深度等于递归调用的层数,所以空间复杂度为O(n)。其他的额外变量不会影响空间复杂度。

7.时间复杂度

汉诺塔中时间复杂度为为O(2^n),n是圆盘的数量。这是因为我们在递归调用时,需要移动两个圆盘。且,进行n次递归调用,每次递归调用需要进行3次移动操作。所以,总移动次数为3^(n-1),这是一个指数级别的复杂度。当圆盘数量越大,解决汉诺塔问题的时间复杂度会变得非常高。

8.不跨层分析

以上就是解决汉诺塔问题的八个方面。

八个方面分析汉诺塔问题相关推荐

  1. 算法自我分析——汉诺塔算法

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

  2. 汉诺塔问题的求解与分析

    一.递归算法介绍 这篇文章讲的是一个古老而又经典的汉诺塔问题,他是递归算法的一个很好的应用实例.有关递归函数的介绍,在使用递归函数求解字符串的逆置问题文章中介绍过.递归思想是来解决可计算问题的,他的根 ...

  3. 汉诺塔的非递归实现(借助堆栈模拟递归)

    汉诺塔的非递归实现 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n,a,b,c).即将n个盘子从起始柱(标记为"a")通过借助柱(标记为"b")移动到目标杜( ...

  4. 汉诺塔(Hanoi Tower)

    问题分析 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘. ...

  5. 汉诺塔问题——递归算法

    一.问题描述 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘 ...

  6. 汉诺塔递归的c语言实现(递归)

    对于递归来讲, 汉诺塔实际是经典到不能再经典的例子了,   每个数据结构的教材对会提到. 但是到最后只给出一段类似下面的一段代码: #include<stdio.h>void move(i ...

  7. 汉诺塔问题的时间复杂度

    一.汉诺塔问题 汉诺塔(Tower of Hanoi)是一个经典的递归算法问题.它描述的是有三根杆子和若干个不同大小的圆盘,圆盘可以按照大小顺序放在杆子上.初始时,所有圆盘都放在左边的杆子上,目标是将 ...

  8. 汉诺塔(河内之塔)相关题目

    1. 标准汉诺塔 题目: 汉诺塔由三根柱子(分别用A.B.C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. 对汉诺塔的一次合法的 ...

  9. python汉诺塔算法解析_基于Python的汉诺塔算法

    首先贴出Python编写的汉诺塔算法的代码: def hanoti(n,x1,x2,x3): if(n == 1): print('move:',x1,'-->',x3) return hano ...

最新文章

  1. Win 7 隐藏小功能——屏幕录制
  2. iOS中EXC_BAD_ACCESS解决办法
  3. Effective Java之静态工厂代替构造器(一)
  4. java期末考试试卷及答案文库_JAVA期末考试试题及答案.docx
  5. DeFi借贷协议Liquity宣布主网将于4月5日上线
  6. python用什么来写模块-Python 3.1 用C写模块 扩展(序)
  7. bzoj 1109: [POI2007]堆积木Klo(二维偏序)
  8. java se 知识点(一)
  9. android 音量曲线,Android音量控制曲线
  10. 方程组在原点附近解matlab,前置血管常发生于A.副胎盘B.胎盘血管瘤C.双叶胎盘D.帆状胎盘...
  11. Excel数据合并(追加写入)
  12. 选择适当的NFC标签类型
  13. 新型循环神经网络IndRNN:可构建更长更深的RNN
  14. curl CURLE_COULDNT_CONNECT
  15. 树莓派 python 蜂鸣器_红外感应模块+蜂鸣器实现简易报警
  16. Docker02-容器管理
  17. Modbus RTU ASCII
  18. 菜鸟LeetCode-动态规划
  19. 数字电路74HC和LS区别**精简版**
  20. Android HierarchyViewer

热门文章

  1. 关于进制补码的八位取值范围为什么是-128~127和补码-128的求取
  2. 黑客瞄准韩国智库、2021年社交媒体网络钓鱼攻击猛增|11月12日全球网络安全热点
  3. [1]PCB设计实验|电路板布局布线要求及规律|电抗和电容的关系|8:30~9:30
  4. win7安装Microsoft Visial C++2015 Redistributable提示:无法建立到信任根
  5. Seata四大模式之XA模式详解及代码实现
  6. 服务器日志文件可以删吗,C:\Windows\Logs\CBS 里面的日志文件能否删除?
  7. 一个“小雏鹰”的翱翔故事丨明星学员风采
  8. Mindspore冻结参数
  9. neo4j构建农业知识图谱
  10. 论文笔记_2018_IEEE Access_评估地图用于车辆定位能力的因素