【python】斐波那契數列的3種計算方式及解析

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標準庫提供的一種緩存機制,讓之前計算過的結果緩存下來,以便接下來的遞歸計算,縮短程序時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章