1. 程式人生 > >理解 漢諾塔

理解 漢諾塔

漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。如圖所示:

提示

這個問題看似複雜,其實不管 n 是多少,都可以歸納為三個步驟: 把 n-1個盤子從 A 移動到 B,此時 A 上只剩下最下面的一個盤子 直接把最後一個盤子從 A 移動到 C 把 B 上的 n-1 個盤子移動到 C 上 我們可以這樣考慮——以上三個步驟包含下面兩種操作: 把多個盤子從一個柱子上移動到另一個柱子上,以第三個柱子作為中介 把一個盤子從一個柱子直接移動到另一個柱子上於是我們可以用兩個函式來分別實現上面兩種操作——第二個函式可以直接一步實現,而第一個函式就需要用到遞迴呼叫了。

一開始考慮多個圓盤容易思維混亂,所以我們先縮小問題規模,從三個圓盤的基本問題開始思考,先找出三層漢諾塔的解法,如圖3.8所示(注意:此圖僅作為原理演示): 

①②③中,移動三次將兩個圓盤從a柱移到了b柱 ⑤⑥⑦中,移動三次將兩個圓盤從b柱移到了c柱 將上述的步驟合起來,就變為了兩層漢諾塔的移動的步驟 如果仍存在困惑,你可以繼續類比推導四層、五層等等的漢諾塔移動方法。  通過這種思考方法,我們總結一下n層漢諾塔的通用移動方法:  將n個圓盤從x柱,經由z柱中轉,移到y柱(即解出漢諾塔移動方法)時:

當n=0時,  不用做任何動作。 當n>0時,  首先,將n-1個圓盤從x柱,經由y柱中轉,移到z柱(解出n-1層漢諾塔), 然後,將1個圓盤從x柱移到y柱, 最後,將n-1個圓盤從z柱,經由x柱中轉,移到y柱(解出n-1層漢諾塔)。 從以上步驟可知,要解出n層漢諾塔,需要使用n-1層漢諾塔的解法。  為了方便表示,我們將解出的n層漢諾塔所需要的最少移動次數表示為:H(n)  例如,移動0個圓盤的次數為0,則:H(0)=0  而移動1個圓盤的次數為1,則:H(1)=1  根據n層漢諾塔所用的步驟,則可以得到移動次數的遞推公式:H(n)=H(n-1)+1+H(n-1) (n≠0n≠0)  因此題並不涉及,這裡直接給出,有興趣的讀者可以自己再推下:H(n)=n2−1