1. 程式人生 > 其它 >分治 + 遞迴之漢諾塔問題詳解

分治 + 遞迴之漢諾塔問題詳解

分治 + 遞迴之漢諾塔問題詳解

說明

  1. 分治演算法,即分而治之演算法,將一個複雜的問題先拆分成許多簡單的類似的小模組,對這些簡單的小模組進行處理過後,再將這些小模組合併到一起,實現分而治的操作
  2. 漢諾塔是指有三個塔A,B,C,A塔有n個按照順序排放好的盤子,如何將這n個盤子移動到C塔,大盤子不能放置在小盤子上面,可以藉助B塔
  3. 此問題很明顯可以使用分治來實現,即將n個判斷先拆分為1個盤子,兩個盤子的情況
  4. 如果只有一個盤子,則直接將其從A塔移動到C塔
  5. 如果有兩個盤子,則先將最上面的盤子移動到B,將下面的盤子移動到C,然後將B的盤子移動到C即可
  6. 如果有兩個以上的盤子,可以將最下面的一個看作一個盤,將上面的所有個看作一個盤,即看作兩個盤,然後很容易想到兩個盤的思路,然後實現即可
  7. 上面的盤如果多餘1個,則再遞迴移動
  8. 原始碼見下

原始碼及分析

/**
     * 漢諾塔實現
     *
     * @param n 盤子個數層數
     * @param a 塔a
     * @param b 塔b
     * @param c 塔c
     */

    public static void hanoiTower(int n, char a, char b, char c) {
        //如果只有一個盤子
        if (n == 1) {
            System.out.println(a + "-->" + c);
        } else {
            //如果盤子個數 > 1,則將最下邊的一個盤子看作一個,將上邊的所有盤子看作一個,遞迴實現
            //如果上邊的盤子個數任然>1,再遞迴
            //直到上邊只有一個盤子

            //第一步,將上面的n-1個盤子從A盤移動到B盤
            hanoiTower(n - 1, a, c, b);
            //第二步再將最小邊的盤子移動到C盤
            System.out.println(a + "-->" + c);
            //第三步將B盤的所有盤子全部移動到C盤
            hanoiTower(n - 1, b, a, c);
        }
    }