汉诺塔(Hanoi)递归算法笔记记录
来源:互联网 发布:python datatime 编辑:程序博客网 时间:2024/05/27 20:52
汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图找了张5个的,意思一样)。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C。
分析:
以5个盘子为例,进行分析。
先将上面4个盘子看成一个整体,那么第一步,需要借助B柱子,将上面4个盘子放在B柱子上,然后将A柱子最底的第5个盘子放到C柱子上,如下图所示:
那么问题就依赖于B柱子上的4个盘子如何移动,也就是n-1个盘子如何从B移动到C上面,这个问题又依赖于3个盘子如何移动
最终,转化为1个盘子移动的问题,最终状态:
伪代码:
if(n==1) 第一个盘子直接从A移动到Celse{ 先把前n-1个盘子从A借助C移动到B 把第n个盘子从A移动到C 再把前n-1个盘子从B借助A移动到C}
java代码实现:
public class Hanoi { public static void move(char a,char b){ System.out.println(a+"---->"+b); } public static void rechanoi(int num,char A,char B,char C){ //只有一个盘子 if(num==1) move(A,C); else{ /* 此处是A柱子上num-1个盘子借助C移动到B */ rechanoi(num-1,A,C,B); move(A,C); /* 将B柱子上的num-1个盘子借助A移动到C */ rechanoi(num-1,B,A,C); } } public static void main(String[] args) { System.out.println("盘子移动情况如下:"); rechanoi(3,'A','B','C'); }
以3个盘子为例进行演示:
盘子移动情况如下:A---->CA---->BC---->BA---->CB---->AB---->CA---->C
递归方法的特征:
- 调用自身
- 当它调用自身的时候,它这样做是为了解决更小的问题
- 存在某个足够简单的问题的层次,在这一层算法不需要调用自身就可以直接解答,且返回结果
后记:当手动地解决这个难题时,有一个经验法则,可以提供帮助,如果试图要移动的子树含有奇数个盘子,开始时直接把最顶端的盘子移动到目标柱子上,如果试图要移动的盘子是偶数,那么开始要把最顶端的盘子移动到中介柱子上。
0 0
- 汉诺塔(Hanoi)递归算法笔记记录
- 递归算法-->汉诺塔hanoi
- 汉诺塔(Hanoi)问题递归算法实现
- hanoi递归算法
- Hanoi递归算法
- hanoi塔经典递归算法
- 算法-Hanoi塔问题+递归
- 汉诺塔 Hanoi 递归实现
- 汉诺塔 hanoi 递归
- 递归之汉诺塔(Hanoi)
- 递归算法之Hanoi(汉诺塔)问题学习
- 汉诺塔问题(Hanoi问题)的递归算法与非递归算法详解
- 《程序员的数学》:汉诺塔问题(Hanoi问题)的递归算法与非递归算法总结
- 算法笔记:使用栈实现汉诺塔(Hanoi)经典算法
- 汉诺塔问题 hanoi(递归)
- 0002算法笔记——【递归】排列问题,整数划分问题,Hanoi问题
- 0002算法笔记——【递归】排列问题,整数划分问题,Hanoi问题
- 01算法笔记——【递归】排列问题,整数划分问题,Hanoi问题
- Android文件管理器
- 把数组排成最小的数
- 页面打印错误 抛出异常 公司内部用
- Android NDK/JNI入门
- iOS FMDB 事务的理解
- 汉诺塔(Hanoi)递归算法笔记记录
- Qt QChart 中 QValueAxis 和 QCategoryAxis 区别
- 扩展欧几里得算法&同余方程&模m乘法逆元详解
- JAVA001对象导论07
- Introducing OctoberCMS系统——一个基于Laravel-based CMS
- SpringMVC学习4
- 获奖名单
- Python2.7遍历读取中文目录
- 大数据读hdfs文件笔记