1、遞迴的定義
遞迴就是子程式(或函式)直接呼叫自己或通過一系列呼叫語句間接呼叫自己,是一種描述問題和解決問題的基本方法。
遞迴常與分治思想同時使用,能產生許多高校的演算法。遞迴常用來解決結構相似的問題。所謂結構相似,是指構成原問題的子問題與原問題在結構上相似,可以用類似的方法解決。具體地,整個問題的解決,可以分為兩部分:第一部分是一些特殊情況,有直接的解法;第二部分與原問題相似,但比原問題的規模小,並且依賴第一部分的結果。。實際上,遞迴是把乙個不能或不好解決的大問題轉化成乙個或幾個小問題,再把這些小問題進一步分解成更小的小問題,直至每個小問題都可以直接解決。因此,遞迴有兩個基本要素:
(1) 邊界條件:確定遞迴到何時終止,也稱為遞迴出口。
(2) 遞迴模式:大問題是如何分解為小問題的,也稱為遞迴體。
遞迴函式只有具備了這兩個要素,才能在有限次計算後得出結果。
2、遞迴演算法例項
2.1求乙個整數n的階乘
階乘的定義如下圖:
根據階乘的遞迴定義,很容易就能寫出求階乘的遞迴演算法。
def
factorial
(n) :
if n == 1 :
return
1#遞迴結束
return n * factorial(n - 1) #問題規模減1,遞迴呼叫
2.2漢諾塔
漢諾塔問題是遞迴函式的經典應用,它來自乙個古老傳說:在世界剛被建立的時候有一座鑽石寶塔a,其上有64個金蝶。所有碟子按從大到小的次序從塔底堆放至塔頂。緊挨著這座塔有另外兩個鑽石寶塔b和c。從世界創始之日起,波羅門的牧師就一直在試圖把塔a上的碟子移動到c上去,其間借助於塔b的幫助。每次只能移動乙個碟子,任何時候都不能把乙個碟子放在比它小的碟子上面。當牧師們完成這個任務時,世界末日也就到了。
對於漢諾塔問題的求解,可以通過以下3步實現:
(1)將塔a上的n -1個碟子借助c塔先移動到b塔上;
(2)把塔a上剩下的乙個碟子移動到塔c上;
(3)將n - 1個碟子從b塔借助塔a移動到塔c上。
很顯然,這是乙個遞迴求解的過程,假設碟子數n=3時,漢諾塔問題的求解過程如下圖所示:
漢諾塔的遞迴演算法(python實現):
def
hanoi
(n, a, b, c) :
if (n == 1) :
move(a, c) #表示只有乙個碟子時,直接從a塔移動到c塔
else :
hanoi(n - 1, a, c, b) #將剩下的a塔上的n-1借助c塔移動到b塔
move(a, c) #將a上最後乙個直接移動到c塔上
hanoi(n - 1, b, a, c) #將b塔上的n-1個碟子借助a塔移動到c塔
遞迴函式的執行軌跡借助漢諾塔這個例項,來講解一下遞迴函式的執行軌跡。在遞迴函式中,呼叫函式和被呼叫函式都是同乙個函式,需要注意的是函式的呼叫層次,如果把呼叫遞迴函式的主函式稱為第0層,進入函式後,首次遞迴呼叫自身稱為第1層呼叫;從第i層遞迴呼叫自身稱為第i+1層。反之退出i+1層呼叫應該返回第i層。下圖是n=3時漢諾塔演算法的執行軌跡,有向弧上的數字表示遞迴呼叫和返回的執行順序。
漢諾塔的遞迴演算法**實現:
#coding=utf-8
i = 1
defmove
(n, mfrom, mto) :
global i
print
"第%d步:將%d號盤子從%s -> %s" %(i, n, mfrom, mto)
i += 1
defhanoi
(n, a, b, c) :
if n == 1 :
move(1, a, c)
else :
hanoi(n - 1, a, c, b)
move(n, a, c)
hanoi(n - 1, b, a, c)
#********************程式入口**********************
try :
n = int(raw_input("please input a integer :"))
print
"移動步驟如下:"
hanoi(n, 'a', 'b', 'c')
except valueerror:
print
"please input a integer n(n > 0)!"
執行結果:
2.3 斐波拉契數列
斐波拉契數列,是這樣的乙個數列:0、1、1、2、3、5、8、13、21、……。
斐波拉契數列的核心思想是:
從第三項起,每一項都等於前兩項的和,即f(n) = f(n - 1) + f(n - 2) (n >= 2)
並且規定f(0) = 0,f(1) = 1
要求:利用遞迴演算法獲得指定項的斐波拉契數列。
#!/usr/bin/python
#coding=utf-8
deffib_list
(n) :
if n == 1
or n == 2 :
return
1else :
m = fib_list(n - 1) + fib_list(n - 2)
return m
print
"**********請輸入要列印的斐波拉契數列項數n的值***********"
try :
n = int(raw_input("enter:"))
except valueerror :
print
"請輸入乙個整數!"
exit()
list2 = [0]
tmp = 1
while(tmp <= n):
tmp += 1
print list2
執行結果:
python遞迴實現 遞迴演算法 python實現
在函式的定義中對這個函式自身的呼叫,就是遞迴。遞迴結構中,遞迴的部分必須比原來的整體簡單,才有可能到達某種終結點 出口 而且必須存在非遞迴的基本結構構成的部分,否則會無限遞迴。學習目標 程式設計實現斐波那契數列求值 f n f n 1 f n 2 程式設計實現求階乘 n 程式設計實現一組資料集合的全...
python實現遞迴演算法
usr bin env python coding utf 8 def recursive 1 n 樓梯有n階台階,上樓可以一步上3階,也可以一步上5階,計算共有多少種不同的走法?設n階台階的走法數為f n 如果台階數小於等於3,走法有2種 一步上3個台階或者5個台階 即f n 3 2 如果台階數為...
演算法 Python遞迴實現走迷宮
迷宮問題 乙個由0或1構成的二維陣列中,假設1是可以移動到的點,0是不能移動到的點,如何從陣列中間乙個值為1的點出發,每一只能朝上下左右四個方向移動乙個單位,當移動到二維陣列的邊緣,即可得到問題的解,類似的問題都可以稱為迷宮問題。在python中可以使用list巢狀表示二維陣列。假設乙個6 6的迷宮...