分治算法,即分而治之,就是把原问题分解为几个类似原问题的子问题,解决完子问题,再把子问题的解合并在一起,就可以得到原问题的解。分治算法一般包括三个过程:

    1. 分解:将原问题分解成若干个子问题。
    2. 解决:递归求解各自子问题,如果子问题足够小,直接求解。
    3. 合并:合并这些子问题的解,即可得到原问题的结果。

    分治算法 - 图1

    1. /**
    2. * 《分治算法》
    3. * 汉诺塔问题:
    4. * 存在三根柱子(ABC),柱子上存在着若干小圆盘,要求把小圆盘从最左边的柱子搬运到最右边,要求小的圆盘需要在大的盘子上面,上面的盘比下面的盘先动(所有圆盘的初始位置在最左边)
    5. *
    6. * | | |
    7. * 【 】 | |
    8. * 【 】 | |
    9. * 【 】 | |
    10. * —————————————— —————————————— ——————————————
    11. * A B C
    12. *
    13. * 分析思路:
    14. * 1.如果只有一个盘,从A杆到C杆直接 A->C即可
    15. * 2.如果有两个盘的话,先把上面一个盘 A->B,然后把下面一个盘 A->C,然后把上面一个盘从B->C
    16. * 3.如果有两个盘及其以上,可以将所有的盘看做两部分(一部分是最下面一个,一部分是上面的所有个)
    17. * 4.先把上面的所有盘 A->B,最下面这个盘从A->C,然后把B杆中的所有盘搬运到C杆
    18. */
    19. public class DivideAndConquer {
    20. /** 
    21. * 汉诺塔问题
    22. */
    23. private static void hanoiTower(int num, char a, char b, char c) {
    24. if (num == 1) {
    25. System.out.println("第1个盘从" + a + "->" + c);
    26. } else {
    27. // 1.先把上面所有盘从a->b
    28. hanoiTower(num - 1, a, c, b);
    29. // 2.最下面这个盘从a->c
    30. System.out.println("第" + num + "个盘从" + a + "->" + c);
    31. // 3.最后把b上所有盘移到c
    32. hanoiTower(num - 1, b, a, c);
    33. }
    34. }
    35. public static void main(String[] args) {
    36. hanoiTower(3, 'A', 'B', 'C');
    37. }
    38. }