遞迴演算法,把大規模問題分解成容易解決而且求解方法相同的子問題,一般用遞迴函式實現,遞迴函式就是不斷呼叫自身的函式。
舉個例子:
俄羅斯套娃(應該都玩過,裡面最小的那個不能開啟,其他能開啟。從最小的娃娃開始,用稍大的那個娃娃套著,直至最大的乙個套住所有的娃娃)。
現在有如圖俄羅斯套娃,已經按正確的方法套好,裡面最小的那個娃娃背上寫了乙個密碼。現在需要求解的問題是得到那個密碼,並且得到密碼後要把這套俄羅斯娃娃按正確的方法套好。
那麼做法應該是,一層一層地開啟娃娃,直到看到最小的娃娃之後獲取密碼,然後乙個乙個的把娃娃合上。也就是,分別按順序對每乙個娃娃進行開啟的操作,直至開啟到小娃娃,檢視密碼,然後再進行依次閉合娃娃的操作。
這就是乙個遞迴過程。而這個遞迴函式就是開啟閉合娃娃,判斷裡面的娃娃是否是最小的那個,如果是,獲取密碼,如果不是,開啟下乙個娃娃,並且最後關閉當前娃娃。
偽**如下:
# 娃娃編號從小到大依次遞增,為1~5
def getkey ( n ) :
if n == 1 : # 判斷當前娃娃是不是最小的那個娃娃
讀取密碼 #進行操作
else :
getkey(n-1) # 對當前娃娃套住的娃娃進行相同的操作
關閉娃娃 #進行操作
乙個問題能否用遞迴求解,要看這個問題能不能逐層分解成乙個個規模依次變小的小問題,同時有能夠進行判斷的下限(就是不能再小的子問題)。
而確定能夠用遞迴過程求解之後,關於求解步驟,可以直接分析最小的子問題跟比最小子問題「大1」的子問題。還需要知道的有:最小子問題的判斷依據以及處理步驟、如何遞迴呼叫自身。
拿漢諾塔問題舉例:(借助b柱,將a柱上的n塊盤子移動到c柱)
最小的子問題就是:將一塊盤子從a移動到c柱
「大1」的子問題是:將兩塊盤子從a移動到c柱,不妨在草稿紙上畫個圖,顯然有三個步驟:
1.將最上面的盤子從a移動到b
2.將a下面的盤子從a移動到c
3.將b上的盤子移動到c
而程式呼叫自身則是逐次對(n-1)個盤子進行同樣的操作就可以解決n個盤子移動的問題。
只需以上三步分析就能得到這個遞迴程式的全部求解過程。
漢諾塔**如下:
n = int(input("輸入初始化時a塔上盤子的個數n:\n"))
def move( n , a , b ,c ):
if n == 1 :
print( "%s is moved to %s" %(a ,c) )
else :
move( n-1 , a , c , b )
move( 1 , a , b , c )
move( 1 , b , a , c )
move( n ,'a' , 'b' , 'c')
如果還是不理解的話,自己動手寫乙個遞迴程式最能加深理解。經典的遞迴問題有:fibonacci數列、掃雷小遊戲。
題外話:傳說古老印度在乙個聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片聖廟,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片,一次只移動一片,不管在哪根針上,小片必在大片上面。當所有的金片都從梵天穿好的那根針上移到另外一概針上時,世界就將在一聲霹靂中消滅,梵塔、廟宇和眾生都將同歸於盡。
n個盤子最少需要移動2^n-1,如果一秒鐘移動一次,計算出來需要5800多億年,那時候,地球還存在嗎?這樣看來,這個毀滅論倒是有一定道理的啊。
經典遞迴漢諾塔
演算法 當只有乙個盤子的時候,只需要從將a塔上的乙個盤子移到c塔上。當a塔上有兩個盤子是,先將a塔上的1號盤子 編號從上到下 移動到b塔上,再將a塔上的2號盤子移動的c塔上,最後將b塔上的小盤子移動到c塔上。當a塔上有3個盤子時,先將a塔上編號1至2的盤子 共2個 移動到b塔上 需借助c塔 然後將a...
經典遞迴題 漢諾塔
漢諾塔遊戲 在這個遊戲中,我們 或者是以為神話中的祭司 有n個不用大小的盤 子和3根木樁。一開始,所有的盤子都按照大小順序套在第1根木樁上,最大的盤子 在底部,最小的盤子在頂部。我們的目的是把所有的盤子都移到第3根木樁上去,在 必要的時候可以借助第2根木樁。我們每次只能移動乙個盤子,但是不能把較大的...
經典遞迴問題 漢諾塔
漢諾塔 漢諾塔問題第一次接觸時就感覺非常有趣,但是由於當時知識有限不能深刻地理解遞迴的含義,所以沒能繼續深究,現在來談一談吧。題目描述 漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從上往下從小到大順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在...