【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标准库提供的一种缓存机制,让之前计算过的结果缓存下来,以便接下来的递归计算,缩短程序时间。

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