1. 程式人生 > >算法——漢諾塔問題(遞歸典型)

算法——漢諾塔問題(遞歸典型)

tle 技術分享 mage blog 算法 圓盤 width wid clas

漢諾塔

漢諾塔是一個發源於印度的益智遊戲,也叫河內塔。相傳它源於印度神話中的大梵天創造的三個金剛柱,一根柱子上疊著上下從小到大64個黃金圓盤。大梵天命令婆羅門將這些圓盤按從小到大的順序移動到另一根柱子上,其中大圓盤不能放在小圓盤上面。當這64個圓盤移動完的時候,世界就將毀滅。


技術分享圖片

算法分析:

一階漢諾塔的移動,顯而易見,從 A->C

技術分享圖片

然後,我們可以探討二階與一階的聯系:

技術分享圖片

不光是對於二階,其實N階漢諾塔相當於執行了三大步驟:

1.在ACB的順序下執行了(N-1)階漢諾塔的移法
2.從A->C移動了第N個盤(最大的)
3.在BAC的順序下執行了(N-1)階漢諾塔的移法

分析清楚,那麽代碼就很簡單了。

void process(int n,string A,string B,string C) {
    if (n == 1) {
        cout << "move from 1 " << A << " to " << C << endl;
        return;
    }
    process(n - 1, A, C, B);
    cout << "move from " <<n<<" "<< A << " to 
" << C << endl; process(n - 1, B, A, C); }

復雜度分析:

根據遞歸,我們很容易得到一個等式,T(n) = T(n-1) + 1 + T(n-1) = 2T(n-1) + 1 ,時間復雜度是O(2^n - 1),證明也很容易。

技術分享圖片

遞歸最重要的兩點:

1.base case(遞歸出口)。必須有某些基本情形,它無需遞歸就能解出。

2.分解。把問題轉化為規模縮小了的同類問題的子問題。

算法——漢諾塔問題(遞歸典型)