hanoi塔演算法
A. 證明hanoi塔問題的遞歸演算法與非遞歸演算法實際上是一回事
證明:設解決漢諾塔問題的函數為Hanoi(n,A,B,C)
用數學歸納法即可證明上述問題
當n=1和n=2時容易直接驗證。設當k<=n-1時,遞歸演算法和非遞歸演算法產生完全相同的移動序列。考察k=n時的情形。
將移動分為順時針移動(S),逆時針移動(N)和非最小圓盤塔間的移動(F)三種情況。
(1)當n為奇數時,順時針非遞歸產生的移動序列為S,F,S,F,······S,逆時針非遞歸演算法產生的序列為N,F,N,F,······N。
當n為偶數時,順時針非遞歸產生的移動序列為N,F,N,F,······N,逆時針非遞歸演算法產生的序列為S,F,S,F,······S。
(2)當n為奇數時,順時針遞歸演算法Hanoi(n,A,B,C)產生的移動序列為
Hanoi(n-1,A,C,B)產生的移動序列,F,Hanoi(n-1,C,B,A)產生的移動序列
其中,Hanoi(n-1,A,C,B)Hanoi(n-1,C,B,A)均為偶數圓盤逆時針移動問題。由數學歸納法知,它們產生的移動序列均為S,F,S,F,······S。因此Hanoi(n,A,B,C)產生的移動序列為S,F,S,F,······S。
當n為偶數時,順時針遞歸演算法Hanoi(n,A,B,C)產生的移動序列為
Hanoi(n-1,A,C,B)產生的移動序列,F,Hanoi(n-1,C,B,A)產生的移動序列
其中,Hanoi(n-1,A,C,B)Hanoi(n-1,C,B,A)均為奇數數圓盤逆時針移動問題。由數學歸納法知,它們產生的移動序列均為N,F,N,F,······N。因此Hanoi(n,A,B,C)產生的移動序列為N,F,N,F,······N。
當n為奇數和偶數時的逆時針遞歸演算法也類似。
由數學歸納法可知,遞歸演算法和非遞歸演算法產生相同的移動序列。
B. 漢諾塔遞歸演算法是什麼
漢諾塔是經典遞歸問題:
相傳在古印度聖廟中,有一種被稱為漢諾塔(Hanoi)的游戲。該游戲是在一塊銅板裝置上,有三根桿(編號A、B、C),在A桿自下而上、由大到小按順序放置64個金盤。
游戲的目標:把A桿上的金盤全部移到C桿上,並仍保持原有順序疊好。操作規則:每次只能移動一個盤子,並且在移動過程中三根桿上都始終保持大盤在下,小盤在上,操作過程中盤子可以置於A、B、C任一桿上。
如果A只有一個(A->C)。
如果A有兩個(A->B),(A->C),(B->C)。
如果A有三個(A->C),(A->B),(C->B),(A->C),(B->A),(B->C),(A->C)。
如果更多,那麼將會爆炸式增長。
遞歸:就是函數自己調用自己。 子問題須與原始問題為同樣的事,或者更為簡單;遞歸通常可以簡單的處理子問題,但是不一定是最好的。
其實遞歸在某些場景的效率是很低下的。尤其是斐波那契.從圖你就可以發現一個簡單的操作有多次重復。因為它的遞歸調用倆個自己。那麼它的遞歸的膨脹率是指數級別的,重復了大量相同計算。
起源:
漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。
大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
C. 求大神講解一下C語言漢諾塔遞歸演算法的簡易理解
一開始我接觸漢諾塔也是很不解,隨著代碼量的積累,現在很容易就看懂了,因此樓主主要還是對遞歸函數的理解不夠深刻,建議你多寫一些遞歸程序,熟練了自己就能理解。
圓盤邏輯移動過程+程序遞歸過程分析
hanoi塔問題, 演算法分析如下,設a上有n個盤子,為了便於理解我將n個盤子從上到下編號1-n,標記為盤子1,盤子2......盤子n。
如果n=1,則將「 圓盤1 」 從 a 直接移動到 c。
如果n=2,則:
(1)將a上的n-1(等於1)個圓盤移到b上,也就是把盤1移動到b上;
(2)再將a上 「盤2」 移到c上;
(3)最後將b上的n-1(等於1)個圓盤移到c上,也就是第(1)步中放在b上的盤1移動到c上。
注意:在這里由於超過了1個盤子,因此不能直接把盤子從a移動到c上,要藉助b,那
么 hanoi(n,one,two,three)的含義就是由n個盤子,從one移動到three,如果n>2
那麼就進行遞歸,如果n=1,那麼就直接移動。
具體流程:
hanoi(2,a,b,c);由於2>1因此進入了遞歸的環節中。
<1>執行hanoi(1,a,c,b):這里就是剛才的步驟(1),代表藉助c柱子,將a柱子上的 1個圓盤(盤1)移動到b柱子,其實由於是n=1,此時c柱子並沒被用到,而是直接移動了。
<2>執行hanoi(1,a,b,c):這是步驟(2),藉助b柱子,將a柱子上的一個圓盤(盤2)移動到c柱子上。這里由於也是n=1,也並沒有真正藉助b柱子,直接移動的。
<3>執行hanoi(1,b,a,c):這是步驟(3),將b上的一個盤子(盤1)移動到c
函數中由於每次調用hanoi的n值都是1,那麼都不會進入遞歸中,都是直接執行了mov移動函數。
如果n=3,則:(倒著想會想明白)移動的倒數第二部,必然是下面的情況
(1)將a上的n`-1(等於2)個圓盤移到c上,也就是將盤1、盤2 此時都在b柱子上,只有這樣才能移動最下面的盤子(盤3)。那麼由於現在我們先忽略的最大的盤子(盤3),那麼我們現在的目標就是,將兩個盤子(盤1、盤2)從a柱子上,藉助c柱 子,移動到b柱子上來,這個過程是上面n=2的時候的移動過程,n=2的移動過程是「2 個盤子,從柱子a,藉助柱子b,移動到柱子c」。現在是「2個盤子,從柱子a,藉助柱子 c,移動到柱子b上」。因此移動過程直接調用n=2的移動過程就能實現。
(2)將a上的一個圓盤(盤3)移到c。
(3)到這一步,由於已經將最大的盤子(盤3)移動到了目的地,此時無論後面怎麼移動都不需要在用到最大的那個盤子(盤3),我們就先忽略他,剩下的目標就是將b上面的n-1個盤子(盤1、盤2)移動到c上,由於a上沒有盤子了,此時要完成上面的目標,就要藉助a盤子。最終達到的目標就是將b上的2個盤子,藉助a移動到c上,這個過程就是當n=2時分析的過程了,僅僅是最開始的柱子(b柱子)和被藉助的柱子(a柱子)不同了。所以直接調用n=2時候的過程就能股實現了。
具體執行過程:
hanoi(3,a,b,c);由於3>1因此進入了遞歸的環節中。
<1>執行hanoi(2,a,c,b):這里代表剛才的步驟(1),將兩個盤子(盤1、盤2)從a移動到b,中間藉助c。根據n=2的分析過程,必然是能夠達到我們的目的。
<2>執行hanoi(1,a,b,c):現在a上只有一個盤子(盤3),直接移動到c上面即可。
<3>執行hanoi(2,b,a,c):此時對應步驟(3),剩下的目標就是將b上的兩個盤子,藉助a移動到c上。那麼同樣根據n=2的移動過程,必然能達到目的。
最終實現了3個盤子從a,藉助b移動到了c。