Python 實現遞迴演算法

2021-07-04 19:42:41 字數 3427 閱讀 8067

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的迷宮...