一、單Hanoi塔
上圖為 3 階 Hanoi 塔
假設有三個命名為 A B C 的塔座 ,在塔座A上插有n個直徑大小不相同,由小到大編號為1 ,2 ,3 ,··· ,n的圓盤,要求將A座上的圓盤移至塔座C
并按同樣的順序疊排
圓盤移動必須遵守下列規則:
1、每次只能移動一個圓盤 。
2、圓盤可以插在任意一個塔座上 。
3、任何時刻都不能將一個較大的圓盤放在一個較小的圓盤上。
問把所有的圓盤從A柱移動到C柱總計需要多少次移動?
一種遞歸的求解方法是分三步解決這個問題。
第一步:使用同樣的方法將n-1個盤子從A柱移動到B柱;
第二步:利用1次移動將最下面的大盤子從A柱移動到C柱;
第三步:還是用第一步的方法將B柱上的n-1個盤子移到C柱,用偽碼描述如下:
算法:Hanoi(A,C,n)
if n=1 then move(A,C)
else Hanoi(A,B,n-1)
move(A,C)
Hanoi(B,C,n-1)
使用這個算法,設總的移動次數為T(n),行2與行4有兩次遞歸調用,每次調用的輸入實例規模是n-1,因此移動次數為T(n-1),行3有1次移動,從而得到如下遞推方程:
T(n) = 2 T(n-1) + 1
初值 T(1) = 1
T(n) = 2 T(n-1) + 1
T(n-1) = 2 T(n-2) + 1
......
T(2) = 2 T
T(1) = 1
T(n) = 2( 2 T(n-2) +1 ) + 1 = 2 2 T(n-2) + 2 + 1 = 2^(n-1) T(1) + 1 = 2^(n-1) + 1
所以移動次數為2^(n-1) + 1次
二、雙Hanoi塔
雙Hanoi塔問題是Hanoi塔問題的一種推廣,與Hanoi塔的不同點在于:2n個圓盤,分成大小不同的n對,每對圓盤完全相同。初始,這些圓盤按照從大到小的次序從下到上放在A柱上,最終要把他們全部移到C柱,移動的規則與Hanoi塔相同。
(1)設計一個移動的算法并給出偽碼描述。
(2)計算你的算法所需要的移動次數。
解:
(1)算法設計思想:分治策略。先遞歸地將上面的2(n-1)個盤子從A柱移動到B柱;用2次移動將最大的2個盤子從A柱移動到C柱;遞歸地將B柱的2(n-1)個盤子從B柱移動到C柱。
偽碼描述是:
BiHanoi(A,C,n) //從A到C移動2n只盤子
if n=1 then BiMove(A,C) //從A到C移動2只盤子
else BiHanoi(A,B,n-1)
BiMove(A,C)
BiHanoi(B,C,n-1)
(2)設2n個盤子的移動次數是T(n),則第2行和第4行的遞歸調用的子問題規模是n-1,第3行是2次移動,于是有
T (n) = 2 T(n-1) + 2
T(1) = 2
解得 T(n) = 2^(n+1) -2