- 写一个计算斐波那契数列值的方法
1 1 2 3 5 8 13 21
def fibonacci(n):
if n <= 1:
return 1
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10)) # 89
# 那么问题来了,在递归深度足够的情况下,下面的递归,2分钟都不出来结果
print(fibonacci(50)) # 阻塞,无结果
# 当计算13的时候,又重新计算8和5,计算21的时候又重复计算13和8
8
3 5
1 2 2 3
- 加缓存版的计算斐波那契数列值的方法
def fibonacci(n,cache=None):
# 第一次进来无缓存对象
if cache is None:
cache = {}
# 如果在缓存中有,则在缓存中取
if n in cache:
return cache[n]
if n<=1:
return 1
# 缓存没有,则计算,且放入缓存
cache[n] = fibonacci(n-1,cache) + fibonacci(n-2,cache)
return cache[n]
print(fibonacci(50)) # 20365011074
# 如果有多个方法都需要这样的缓存,每个都加,岂不是很累
# 用装饰器,写一次就够。
- 用装饰器
# 定义一个装饰器
def memo(func):
cache = {}
def wrap(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrap
#使用装饰器
@memo
def fibonacci(n):
if n <= 1:
return 1
return fibonacci(n-1) + fibonacci(n-2)
# 还是一样调用
print(fibonacci(50)) # 20365011074