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