【python进阶教程】深入理解python装饰器,装饰器使用案例提高运算效率(计算重复计算子问题的问题)
文章目录
重复计算子问题的问题
案例一斐波那契数列
- 普通实现
def fib(n):
if n <= 1:
return 1
return fib(n - 1) + fib(n - 2)
使用缓存改写
def fibcache(n, cache=None):
if cache is None:
cache = {}
if n in cache:
return cache[n]
if n <= 1:
return 1
cache[n] = fibcache(n - 1, cache) + fibcache(n - 2, cache)
return cache[n]
问题:
案例二 一共有十个台阶的楼梯, 从下往上走,一次只能迈1-3个台阶,并且不能后退,走完这个楼梯共所有的楼梯共有多少中走法
def cache_num(func):
cache = {}
def wrap(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args] # 如果没有的话就会被添加
return wrap
@cache_num
def climb2(n, steps):
count = 0
if n == 0:
count = 1
elif n > 0:
for step in steps:
count += climb2(n - step, steps)
return count
装饰器的使用方式二
@cache_num
def fib(n):
if n <= 1:
return 1
return fib(n - 1) + fib(n - 2)
print(fib(30))
装饰器的使用方式一
fibn = cache_num(fib)
print(fibn(50))
print(climb2(10, (1, 2, 3)))