法國數學家愛德華·盧卡斯曾編寫過乙個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。
後來,這個傳說就演變為漢諾塔遊戲:
1.有三根桿子a,b,c。a桿上有若干碟子
2.每次移動一塊碟子,小的只能疊在大的上面
3.把所有碟子從a杆全部移到c桿上
a柱子有7塊盤子時,可借助b將a柱子的盤子全部移至c柱子,由小到大從上往下擺放
遊戲的起始狀態,a柱子
7塊盤子,移至
c柱子:
要實現遊戲,需將a柱子紅色盤子上面的6塊借助c移至b柱子,盤子由小到大從上往下擺放,在將最大的紅色盤子由a柱子移至c柱子,此時a柱子沒有盤子,這個時候是遊戲的乙個臨界狀態,最大的紅色盤子有序的擺放在c柱子(現在可以不管紅色盤子了,因為最大的如果你把它放那不動,則可以無視它的,其他盤子可以在三個柱子上移來移去.它是最大嘛),接著需要將b柱子的6塊盤子借助a移動到c柱子,即可完成漢諾塔遊戲了。這個過程中,7塊盤子的漢諾塔遊戲可演變為2個6塊盤子的漢諾塔遊戲了,2個6塊盤子的漢諾塔遊戲了演變成4個5塊盤子的漢諾塔遊戲了……,遞迴的出口就是只有一塊盤子的時候了,直接移動盤子,這就是經典遞迴思想了
遊戲的臨界狀態,b柱子
6塊盤子,移動至c柱子
漢諾塔問題是乙個經典的「重複問題「(recurrent problem),解法也從中所知,最少移動步驟是2^n - 1。
n個盤子,abc三個地點,將a上的n個盤子移動到c上。最少的步驟是多少?
ac[n] = ab[n-1] + ac[1] + bc[n-1]
因為ac[n] = bc[n] = ab[n] = t(n)
所以以上等式可以寫成
t(n) = t(n-1) + 1 + t(n-1)=2^1*t(n-1)+1=2^2*t(n-2)+1=......=2^n-1*t(n-(n-1))+1=2^n-1*t(1))+1,從而得到t(n) = 2^n - 1
private function hanoi_r($n,$a,$b,$c)else
}private function move($a,$n,$c)
public function hanoi($n)
遞迴演算法 漢諾塔問題
圖1 漢諾塔分析 三個過程 漢諾塔問題,經典遞迴問題 遞迴問題的關鍵 1.如何縮小問題的規模 2.如何解決最簡單問題 即 1找出遞迴體,2找出遞迴出口 試圖追蹤程式執行過程,都是徒勞的 2018年4月10日10 49 46 by 楷諧之力 includevoid move char frm,char...
漢諾塔問題遞迴演算法
1.題目 漢諾塔 hanoi tower 又稱河內塔,源於印度乙個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只...
遞迴演算法 漢諾塔問題
程式呼叫自身的程式設計技巧稱為遞迴。乙個過程或函式在其定義或說明中又直接或間接地呼叫自身的一種方法,通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解。遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的 量。遞迴的能力在於用有限的語句來定義物件的無...