**:
乙個廟裡有三個柱子,第乙個有64個盤子,從上往下盤子越來越大。要求廟裡的老和尚把這64個盤子全部移動到第三個柱子上。移動的時候始終只能小盤子壓著**子。而且每次只能移動乙個。
1、此時老和尚(後面我們叫他第乙個和尚)覺得很難,所以他想:要是有乙個人能把前63個盤子先移動到第二個柱子上,我再把最後乙個盤子直接移動到第三個柱子,再讓那個人把剛才的前63個盤子從第二個柱子上移動到第三個柱子上,我的任務就完成了,簡單。所以他找了比他年輕的和尚(後面我們叫他第二個和尚),命令:
① 你丫把前63個盤子移動到第二柱子上
② 然後我自己把第64個盤子移動到第三個柱子上後
③ 你把前63個盤子移動到第三柱子上
2、第二個和尚接了任務,也覺得很難,所以他也和第乙個和尚一樣想:要是有乙個人能把前62個盤子先移動到第三個柱子上,我再把最後乙個盤子直接移動到第二個柱子,再讓那個人把剛才的前62個盤子從第三個柱子上移動到第二個柱子上,我的任務就完成了,簡單。所以他也找了比他年輕的和尚(後面我們叫他第三和尚),命令:
① 你把前62個盤子移動到第三柱子上
② 然後我自己把第63個盤子移動到第二個柱子上後
③ 你把前62個盤子移動到第二柱子上
3、第三個和尚接了任務,又把移動前61個盤子的任務依葫蘆話瓢的交給了第四個和尚,等等遞推下去,直到把任務交給了第64個和尚為止(估計第64個和尚很鬱悶,沒機會也命令下別人,因為到他這裡盤子已經只有乙個了)。
4、到此任務下交完成,到各司其職完成的時候了。完成回推了:
第64個和尚移動第1個盤子,把它移開,然後第63個和尚移動他給自己分配的第2個盤子。
第64個和尚再把第1個盤子移動到第2個盤子上。到這裡第64個和尚的任務完成,第63個和尚完成了第62個和尚交給他的任務的第一步。
從上面可以看出,只有第64個和尚的任務完成了,第63個和尚的任務才能完成,只有第2個和尚----第64個和尚的任務完成後,第1個和尚的任務才能完成。這是乙個典型的遞迴問題。 現在我們以有3個盤子來分析:
第1個和尚命令:
① 第2個和尚你先把第一柱子前2個盤子移動到第二柱子。(借助第三個柱子)
② 第1個和尚我自己把第一柱子最後的盤子移動到第三柱子。
③ 第2個和尚你把前2個盤子從第二柱子移動到第三柱子。
很顯然,第二步很容易實現(哎,人總是自私地,把簡單留給自己,困難的給別人)。
其中第一步,第2個和尚他有2個盤子,他就命令:
① 第3個和尚你把第一柱子第1個盤子移動到第三柱子。(借助第二柱子)
② 第2個和尚我自己把第一柱子第2個盤子移動到第二柱子上。
③ 第3個和尚你把第1個盤子從第三柱子移動到第二柱子。
同樣,第二步很容易實現,但第3個和尚他只需要移動1個盤子,所以他也不用在下派任務了。(注意:這就是停止遞迴的條件,也叫邊界值)
第三步可以分解為,第2個和尚還是有2個盤子,命令:
① 第3個和尚你把第二柱子上的第1個盤子移動到第一柱子。
② 第2個和尚我把第2個盤子從第二柱子移動到第三柱子。
③ 第3個和尚你把第一柱子上的盤子移動到第三柱子。
分析組合起來就是:1→3 1→2 3→2 借助第三個柱子移動到第二個柱子 |1→3 自私人留給自己的活| 2→1 2→3 1→3借助第乙個柱子移動到第三個柱子|共需要七步。
如果是4個盤子,則第乙個和尚的命令中第1步和第3步各有3個盤子,所以各需要7步,共14步,再加上第1個和尚的1步,所以4個盤子總共需要移動7+1+7=15步,同樣,5個盤子需要15+1+15=31步,6個盤子需要31+1+31=64步……由此可以知道,移動n個盤子需要(2的n次方)-1步。
從上面整體綜合分析可知把n個盤子從1座(相當第一柱子)移到3座(相當第三柱子):
(1)把1座上(n-1)個盤子借助3座移到2座。
(2)把1座上第n個盤子移動3座。
(3)把2座上(n-1)個盤子借助1座移動3座。
下面用hanoi(n,a,b,c)表示把1座n個盤子借助2座移動到3座。
(1)hanoi(n-1,1,3,2)
(2)move(n,1,3)
(3)步上是 hanoi(n-1,2,1,3)
用c語言表示出來,就是:
#include
int move(int n,char a, char b)
int hanoi(int n,char a,char b,char c)
;return 0;
}int main()
遞迴演算法 漢諾塔問題
圖1 漢諾塔分析 三個過程 漢諾塔問題,經典遞迴問題 遞迴問題的關鍵 1.如何縮小問題的規模 2.如何解決最簡單問題 即 1找出遞迴體,2找出遞迴出口 試圖追蹤程式執行過程,都是徒勞的 2018年4月10日10 49 46 by 楷諧之力 includevoid move char frm,char...
漢諾塔問題遞迴演算法
1.題目 漢諾塔 hanoi tower 又稱河內塔,源於印度乙個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只...
遞迴演算法 漢諾塔問題
程式呼叫自身的程式設計技巧稱為遞迴。乙個過程或函式在其定義或說明中又直接或間接地呼叫自身的一種方法,通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解。遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的 量。遞迴的能力在於用有限的語句來定義物件的無...