斐波那契數列的特徵: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...