分治算法,即分而治之,就是把原问题分解为几个类似原问题的子问题,解决完子问题,再把子问题的解合并在一起,就可以得到原问题的解。分治算法一般包括三个过程:
- 分解:将原问题分解成若干个子问题。
- 解决:递归求解各自子问题,如果子问题足够小,直接求解。
- 合并:合并这些子问题的解,即可得到原问题的结果。
/*** 《分治算法》* 汉诺塔问题:* 存在三根柱子(ABC),柱子上存在着若干小圆盘,要求把小圆盘从最左边的柱子搬运到最右边,要求小的圆盘需要在大的盘子上面,上面的盘比下面的盘先动(所有圆盘的初始位置在最左边)** | | |* 【 】 | |* 【 】 | |* 【 】 | |* —————————————— —————————————— ——————————————* A B C** 分析思路:* 1.如果只有一个盘,从A杆到C杆直接 A->C即可* 2.如果有两个盘的话,先把上面一个盘 A->B,然后把下面一个盘 A->C,然后把上面一个盘从B->C* 3.如果有两个盘及其以上,可以将所有的盘看做两部分(一部分是最下面一个,一部分是上面的所有个)* 4.先把上面的所有盘 A->B,最下面这个盘从A->C,然后把B杆中的所有盘搬运到C杆*/public class DivideAndConquer {/*** 汉诺塔问题*/private static void hanoiTower(int num, char a, char b, char c) {if (num == 1) {System.out.println("第1个盘从" + a + "->" + c);} else {// 1.先把上面所有盘从a->bhanoiTower(num - 1, a, c, b);// 2.最下面这个盘从a->cSystem.out.println("第" + num + "个盘从" + a + "->" + c);// 3.最后把b上所有盘移到chanoiTower(num - 1, b, a, c);}}public static void main(String[] args) {hanoiTower(3, 'A', 'B', 'C');}}
