案例:
1、斐波那契数列1,1,2,3,5,8
求数列第n项的值
def fibonacci(n):
if n <= 1:
return 1
return fibonacci(n-1) + fibonacci(n-2)
2、楼梯问题,有100阶楼梯,一个人可以每次迈1~3阶,一共有多少种走法?
def climb(n, steps):
count = 0
if n == 0:
count = 1
elif n > 0:
for step in steps:
count += climb(n-step,steps)
return count
上面两个问题都存在着重复的计算导致计算效率低下,可以通过添加缓存来提高效率。
def fibonacii(n):
res = cache.get(n)
if res:
return res
if n <= 1:
return 1
res = cache[n] = fibonacii(n - 1) + fibonacii(n - 2)
return res
如果需要改动的函数有10个或者更多,每个函数都如此改动过去?
则需要生产一个包裹该函数的工厂函数,当输入n时去缓存里寻找,如果有则返回该缓存,没有则调用fibonacci函数,并更新缓存
def memo(func):
cache = {}
def wrap(*args): # 接受任意参数
res = cache.get(args)
if not res:
res = cache[args] = func(*args)
return res
return wrap
fibonacii = memo(fibonacii) # @memo 等同于 fibonacii = memo(fibonacii)
print(fibonacii(90))
定义装饰器函数,用它来生成一个在原函数基础上添加了新功能的函数,替代原函数