实现斐波拉契的三种方法:
方法一:递归方法
def fib_1(index):
if index <= 2:
return 1
else:
return fib_1(index-1) + fib_1(index-2)
if __name__ == "__main__":
print(fib_1(10))
结果如下:
55
方法二:遍历
def fib_2(index):
re_list = []
n, a, b = 0, 0, 1
while n < index:
re_list.append(b)
a, b = b, a+b
n +=1
return re_list
if __name__ == "__main__":
print(fib_2(10))
结果如下:
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
方法三:生成器
def fib_3(index):
n, a, b = 0, 0, 1
while n < index:
yield b
a, b = b, a+b
n += 1
if __name__ == "__main__":
for item in fib_3(10):
print(item, end=" ")
结果如下:
1 1 2 3 5 8 13 21 34 55
性能分析:
性能从高到底:fib_3 , fib_2, fib_1
fib_1改进版
def decorate(func):
cache = {} # 缓存
@functools.wraps(func)
def wrap(*args):
res = cache.get(args)
if not res:
res = cache[args] = func(*args)
return res
return wrap
@decorate
def fib_1(index):
if index <=2:
return 1
return fib_1(index - 1) + fib_1(index - 2)
#性能分析
if __name__ == '__main__':
t_1 = timeit.timeit(stmt="fib_1(100)", setup="from __main__ import fib_1", number=100)
t_2 = timeit.timeit(stmt="fib_2(100)", setup="from __main__ import fib_2", number=100)
t_3 = timeit.timeit(stmt="fib_3(100)", setup="from __main__ import fib_3", number=100)
print(t_1) # 打印执行
print(t_2) # 打印执行
print(t_3) # 打印执行
结果:
0.00027622655034065247
0.001580890268087387
2.839416265487671e-05
性能分析:
性能从高到底:fib_3 , fib_1, fib_2