def fab(n):
if n==1:
return 1
if n==2:
return 1
if n>2:
return fab(n-2)+fab(n-1)
for each in range(1,11):
print(fab(each))
def fab2(n):
a=b=1
for each in range(n):
yield(a)
a,b=b,a+b
print(list(fab2(10)))
def fab3(n):
l=[1,1]
for x in range(n):
l.append(sum(l[-2:]))
return l
print(fab3(10))
第一種爲遞歸,簡潔。
第二種爲yield方式調用生成器generator,性能上可能會好些,也算是python iterable 可迭代對象的一種用法,其實可迭代對象在python 中很常見,比如range函數,列表這些都是可迭代對象,可以遵循某種規則將其中的元素一一取出,即爲可迭代對象。
第三種,將計算結果保存到列表L,並從列表的最後2位取數並計算,然後壓入列表,這樣列表的內容即爲所求數列。
單單計算前30項,這三種算法就顯示出巨大的性能差異,1算法由於含有大量的冗餘計算(根本原因是沒記性),性能落後2算法1000多倍,而3比2還快6-10倍。
使用functools.lru_cache 加強版
from functools import lru_cache
@lru_cache()
def fab(n):
if n==1:
return 1
if n==2:
return 1
if n>2:
return fab(n-2)+fab(n-1)
for each in range(1,11):
print(fab(each))
print(fab.cache_info())
這樣可以使用python標準庫提供的一種緩存機制,讓之前計算過的結果緩存下來,以便接下來的遞歸計算,縮短程序時間。