斐波那契數列,遞迴函式的用例

2021-09-28 13:58:00 字數 1609 閱讀 8200

斐波那契數列的特徵:f2=f1=1,fn=fn-1 + fn-2 ; n>=3 例如:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, ...

# 方法1 定義法 但是效率最低:o(1.618^n)

# 該方法也適合產生類斐波那契數列

a=time()

def fb(n):

if n==1 or n==2:

return 1

return fb(n-1)+fb(n-2) # 一般遞迴,return語句包含了表示式

for i in range(1,35):

print(fb(i), end=' ')

print('\ncost=',time()-a)

# 方法2 遞迴方法相比方法1效率提公升巨大

# 該方法也適合產生類斐波那契數列

b=time()

def fb(n,s=(1,1)):

if n==1:

return s[0]

a,b = s

return fb(n-1,s=(b, a+b)) # 對遞迴做了優化:尾遞迴

"""尾遞迴是指,在函式返回的時候,呼叫自身本身,並且,return語句不能包含表示式。

這樣,編譯器或者直譯器就可以把尾遞迴做優化,使遞迴本身無論呼叫多少次,都只占用乙個棧幀,

不會出現棧溢位的情況。

尾遞迴呼叫時,如果做了優化,棧不會增長,因此,無論多少次呼叫也不會導致棧溢位。

遺憾的是python標準的直譯器沒有針對尾遞迴做優化,任何遞迴函式都存在棧溢位的問題。

"""for i in range(1,35):

print(fb(i),end=' ')

print('\ncost=',time()-b)

# 方法3 遞推法,線性時間消耗 o(n),使用迴圈代替遞迴

# 該方法也適合產生類斐波那契數列

c=time()

def fb(n):

a,b=1,1

for _ in range(n):

a,b = b, a+b

return a

for i in range(1,35):

print(fb(i),end=' ')

print('\ncost=',time()-c)

矩陣形式推導

# 方法4 矩陣方法,時間消耗o(logn),最小消耗

# 該方法只適合產生斐波那契數列

演算法複雜度分析

另一典型遞迴用例:漢諾塔

函式遞迴之斐波那契數列

背景 在函式遞迴問題中乙個典型問題是求解斐波那契數列 但是函式遞迴會面臨著資源的大量消耗問題 按照一種最為基本的寫法 include using namespace std long long fib long long a intmain cout fib n return0 在n 50左右時,大...

用遞迴實現解決斐波那契數列。

a 遞迴概念和注意事項 a 遞迴概念 遞迴,指在當前方法內呼叫自己的這種現象 遞迴分為兩種,直接遞迴和間接遞迴 直接遞迴稱為方法自身呼叫自己。間接遞迴可以 a方法呼叫 b方法,b方法呼叫 c方法,c方法呼叫a方法 b 注意事項 遞迴一定要有出口 必須可以讓程式停下 遞迴次數不能過多 構造方法 禁止遞...

遞迴與斐波那契數列

迭代實現 def fab n a1 1 a2 1 a3 1if n 1 print 輸入有誤 return 1 while n 2 0 a3 a1 a2 a1 a2 a2 a3 a 1return a3 result fab 20 if result 1 print 總共有 d對小兔子誕生 resu...