八个方面分析汉诺塔问题
汉诺塔是什么?
汉诺塔问题就是将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.不跨层分析
以上就是解决汉诺塔问题的八个方面。
八个方面分析汉诺塔问题相关推荐
- 算法自我分析——汉诺塔算法
汉诺塔算法 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小 ...
- 汉诺塔问题的求解与分析
一.递归算法介绍 这篇文章讲的是一个古老而又经典的汉诺塔问题,他是递归算法的一个很好的应用实例.有关递归函数的介绍,在使用递归函数求解字符串的逆置问题文章中介绍过.递归思想是来解决可计算问题的,他的根 ...
- 汉诺塔的非递归实现(借助堆栈模拟递归)
汉诺塔的非递归实现 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n,a,b,c).即将n个盘子从起始柱(标记为"a")通过借助柱(标记为"b")移动到目标杜( ...
- 汉诺塔(Hanoi Tower)
问题分析 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘. ...
- 汉诺塔问题——递归算法
一.问题描述 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘 ...
- 汉诺塔递归的c语言实现(递归)
对于递归来讲, 汉诺塔实际是经典到不能再经典的例子了, 每个数据结构的教材对会提到. 但是到最后只给出一段类似下面的一段代码: #include<stdio.h>void move(i ...
- 汉诺塔问题的时间复杂度
一.汉诺塔问题 汉诺塔(Tower of Hanoi)是一个经典的递归算法问题.它描述的是有三根杆子和若干个不同大小的圆盘,圆盘可以按照大小顺序放在杆子上.初始时,所有圆盘都放在左边的杆子上,目标是将 ...
- 汉诺塔(河内之塔)相关题目
1. 标准汉诺塔 题目: 汉诺塔由三根柱子(分别用A.B.C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. 对汉诺塔的一次合法的 ...
- python汉诺塔算法解析_基于Python的汉诺塔算法
首先贴出Python编写的汉诺塔算法的代码: def hanoti(n,x1,x2,x3): if(n == 1): print('move:',x1,'-->',x3) return hano ...
最新文章
- Win 7 隐藏小功能——屏幕录制
- iOS中EXC_BAD_ACCESS解决办法
- Effective Java之静态工厂代替构造器(一)
- java期末考试试卷及答案文库_JAVA期末考试试题及答案.docx
- DeFi借贷协议Liquity宣布主网将于4月5日上线
- python用什么来写模块-Python 3.1 用C写模块 扩展(序)
- bzoj 1109: [POI2007]堆积木Klo(二维偏序)
- java se 知识点(一)
- android 音量曲线,Android音量控制曲线
- 方程组在原点附近解matlab,前置血管常发生于A.副胎盘B.胎盘血管瘤C.双叶胎盘D.帆状胎盘...
- Excel数据合并(追加写入)
- 选择适当的NFC标签类型
- 新型循环神经网络IndRNN:可构建更长更深的RNN
- curl CURLE_COULDNT_CONNECT
- 树莓派 python 蜂鸣器_红外感应模块+蜂鸣器实现简易报警
- Docker02-容器管理
- Modbus RTU ASCII
- 菜鸟LeetCode-动态规划
- 数字电路74HC和LS区别**精简版**
- Android HierarchyViewer
热门文章
- 关于进制补码的八位取值范围为什么是-128~127和补码-128的求取
- 黑客瞄准韩国智库、2021年社交媒体网络钓鱼攻击猛增|11月12日全球网络安全热点
- [1]PCB设计实验|电路板布局布线要求及规律|电抗和电容的关系|8:30~9:30
- win7安装Microsoft Visial C++2015 Redistributable提示:无法建立到信任根
- Seata四大模式之XA模式详解及代码实现
- 服务器日志文件可以删吗,C:\Windows\Logs\CBS 里面的日志文件能否删除?
- 一个“小雏鹰”的翱翔故事丨明星学员风采
- Mindspore冻结参数
- neo4j构建农业知识图谱
- 论文笔记_2018_IEEE Access_评估地图用于车辆定位能力的因素