《编程导论(Java)·10.3.2 案例:汉诺塔问题》
来源:互联网 发布:velocity vm 数据库 编辑:程序博客网 时间:2024/05/24 16:15
汉诺塔问题(Hanoi Tower problem):有三根杆子A、B、C,A杆上串有上小下大若干碟子。每次移动一块碟子,在确保小碟子只能叠在大碟子上面的条件下,利用B过渡,请把所有碟子从A杆移到C杆上。
本问题充分体现使用递归法的2条实践准则:
1、设计优先。简洁而清晰的程序设计优先。汉诺塔问题的递归算法简短优雅,但是递归算法效率极其低下。碟子数为N时需要移动2N-1次,是算法中指数复杂度的典型例子。
2、效率平衡。如果可能,改进为迭代(Scheme中编写尾递归,Java中采用循环语句)。解答:
结束条件: A杆上只有一个碟子,将它移到C。
递归式:
1、将上面的n-1个碟子从出发地A移到中转站B;
2、将第n个碟子移到目的地C;
3、将n-1个碟子从中转站B移到目的地C。package algorithm.recursion;public class HanoiTower{ private static int step= 0; /**汉诺塔的递归演示。 * @param from 碟子的出发地 * @param temp 碟子的中转站 * @param to 碟子的到达地 * @param n 要移动的碟子个数 */ static void hanoi(char from, char temp, char to, int n){ if (n == 1) { step++; System.out.println("第"+step+ "步: "+ from+"→"+ to); }else { //将n-1个碟子移到中转站,故目前的到达地是temp。 hanoi(from, to,temp,n-1); //第n个碟子移到到达地 step++; System.out.println("第"+step+ "步: "+ from+"→"+ to); //将n-1个碟子移到到达地。 hanoi(temp,from,to,n-1); } }}static void move(int n){
System.out.println("将移动"+n+"个盘子");
step= 0;
hanoi('a', 'b','c', n);
}
move(3)的输出:
将移动3个盘子
第1步: a→c
第2步: a→b
第3步: c→b
第4步: a→c
第5步: b→a
第6步: b→c
第7步: a→c
0 0
- 《编程导论(Java)·10.3.2 案例:汉诺塔问题》
- 《编程导论(Java)·9.2.3 案例:M集》
- 《编程导论(Java)·2.3.2 方法同名问题》
- 《编程导论(Java)·7.4.4 String对象问题》
- 《编程导论(Java)·4.1.3 String》乱码问题
- 《编程导论》课程设计案例
- 《编程导论(Java) ·10.3递归思维》
- 《编程导论(Java)·0.1.2 二进制补码》
- 《编程导论(Java)·3.1.2 方法》之 副作用
- 《编程导论(Java)·11.2.2 堆排序*》
- 《编程导论(Java)·前言》
- 《编程导论(Java)·1.2类》
- 《编程导论(Java)·11排序》
- 《编程导论(Java)》Home
- 《编程导论(Java) ·10.3》补充:递归的优化
- 《编程导论(Java)·章首格言》
- 《编程导论(Java)·11.1(排序)说明》
- 《编程导论(Java)·3.2.4 循环语句》
- ecshop销售排行榜显示销售 销量的商品的件数方法
- XML 与 HTML
- 在CentOS上把MySQL从5.5升级到5.6
- 学会学习 读书笔记
- 批量清除ecshop全部商品的精品 新品和热销属性的方法
- 《编程导论(Java)·10.3.2 案例:汉诺塔问题》
- Ecshop的lbi库文件中嵌套调用另一个lbi库文件
- activity之间的数据传递方法
- Android 文件系统目录分析(手机系统目录分析)
- 在ECSHOP分类列表页中调用商品货号
- C++第一次上机实验-2
- PHP写入数据库中文乱码问题
- linux 下按内容查找文件
- Linux环境下的OpenMP多线程编程