【算法】递归法实现汉诺塔问题
来源:互联网 发布:阮星竹 知乎 编辑:程序博客网 时间:2024/06/07 12:52
递归法实现汉诺塔问题
这里的汉诺塔问题稍加改动:从“左”不能直接到“右”,必须先从“左”到“中”,再从“中”到“右”;从“右”到“左”同理;即只能在相邻的柱子间移动。
思路:
process(int num, String from, String to)
函数,实现了第num
块,从from
柱子到to
柱子的移动过程- 移动分为两类,相邻柱子的移动,不相邻柱子的移动(如果是传统的汉诺塔问题则不用如此分类)
- 相邻柱子的移动:
从"左"到"中"
,从"右"到"中"
,从"中"到"左"
,从"中"到"右"
- 上面的
num - 1
层,从from
移到另一个柱子,即除了from
和to
的另一根柱子
- 然后第
num
块从from
到to
- 上面的
num - 1
层从另一个柱子到to
- 不相邻柱子的移动:
从"左"到"右"
,从"右"到"左"
- 上面的
num - 1
层从from
到to
- 第
num
块,从from
移到middle
- 然后第
num - 1
块从to
到from
- 第
num
块,从middle
移到to
- 上面的
num - 1
层从from
到to
package com.lilydedbb;/** * Created by dbb on 2016/12/24. */public class HanoiProblemByRecursion { private static String left = "left "; private static String mid = "middle"; private static String right = "right "; public static int hanoiProblem(int num){ if (num < 1) return 0; return process(num, left, right); } // 返回的是步数 public static int process(int num, String from, String to){ // 只有一个的时候 if(num == 1){ if(from.equals(mid) || to.equals(mid)){ System.out.println("move 1 from " + from + " to " + to); return 1; }else{ System.out.println("move 1 from " + from + " to middle"); System.out.println("move 1 from middle to " + to); return 2; } } // 从"左"到"中",从"右"到"中",从"中"到"左",从"中"到"右" if(from.equals(mid) || to.equals(mid)){ String another = (from.equals(left) || to.equals(left)) ? right : left; int part1 = process(num - 1, from, another); int part2 = 1; System.out.println("move " + num + " from " + from + " to " + to); int part3 = process(num - 1, another, to); return part1 + part2 + part3; } else { // 从"左"到"右",从"右"到"左" int part1 = process(num - 1, from, to); int part2 = 1; System.out.println("move " + num + " from " + from + " to middle"); int part3 = process(num - 1, to, from); int part4 = 1; System.out.println("move " + num + " from middle to " + to); int part5 = process(num - 1, from, to); return part1 + part2 + part3 + part4 + part5; } }}
测试程序及测试结果如下:
int steps = HanoiProblemByRecursion.hanoiProblem(2);System.out.println("The Minimum step is " + steps);
move 1 from left to middlemove 1 from middle to right move 2 from left to middlemove 1 from right to middlemove 1 from middle to left move 2 from middle to right move 1 from left to middlemove 1 from middle to right The Minimum step is 8Process finished with exit code 0
0 0
- 【算法】递归法实现汉诺塔问题
- 汉诺塔(Hanoi)问题递归算法实现
- 汉诺塔问题递归算法
- 递归算法-汉诺塔问题
- 递归算法--汉诺塔问题
- 递归算法--汉诺塔问题
- 汉诺塔递归算法实现
- 统计数字问题 算法实现 (补0递归法)
- 递归实现汉诺塔问题
- 递归实现汉诺塔问题
- 递归实现汉诺塔问题
- 递归实现汉诺塔问题
- 汉诺塔问题递归实现
- 汉诺塔问题--递归实现
- 递归实现汉诺塔问题
- 八皇后问题递归回溯算法实现
- C算法-兔子问题非递归实现
- 全排列问题算法实现--递归
- Rotate Array
- ANSI C中scanf()的转换说明符和scanf()的转换修饰符
- hdu1040 - As Easy As A+B
- 段描述符与段选择子的结构
- C语言编译全过程剖析
- 【算法】递归法实现汉诺塔问题
- 要做好SQA,建议自己看哪些书?
- ListView、AdapterView、RecyclerView全面解析
- linux下安装mysql数据库(3)
- 【算法】最大窗口
- 什么是Code Review 代码审查
- 【算法】构造数组的MaxTree
- apache2部署访问yaaw
- Python挑战第三题