分治 + 遞迴之漢諾塔問題詳解
阿新 • • 發佈:2021-06-14
分治 + 遞迴之漢諾塔問題詳解
說明
- 分治演算法,即分而治之演算法,將一個複雜的問題先拆分成許多簡單的類似的小模組,對這些簡單的小模組進行處理過後,再將這些小模組合併到一起,實現分而治的操作
- 漢諾塔是指有三個塔A,B,C,A塔有n個按照順序排放好的盤子,如何將這n個盤子移動到C塔,大盤子不能放置在小盤子上面,可以藉助B塔
- 此問題很明顯可以使用分治來實現,即將n個判斷先拆分為1個盤子,兩個盤子的情況
- 如果只有一個盤子,則直接將其從A塔移動到C塔
- 如果有兩個盤子,則先將最上面的盤子移動到B,將下面的盤子移動到C,然後將B的盤子移動到C即可
- 如果有兩個以上的盤子,可以將最下面的一個看作一個盤,將上面的所有個看作一個盤,即看作兩個盤,然後很容易想到兩個盤的思路,然後實現即可
- 上面的盤如果多餘1個,則再遞迴移動
- 原始碼見下
原始碼及分析
/** * 漢諾塔實現 * * @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); } }