#如何使用函数装饰器
# 实际案例:为多个函数统一添加某种功能 比如计时统计,记录日志,缓存运算结果等
# 题目1;斐波那契数列的第N项
#画一个缓存
def fibonacci(n,cache=None):
if cache is None:
cache={}
if n in cache:
return cache[n]
if n<=1:
return 1
#return fibonacci(n-1)+fibonacci(n-2)
cache[n] = fibonacci(n-1,cache)+fibonacci(n-2,cache)
return cache[n]
#装饰器给多个函数添加缓存 包裹函数
def memo(func):
cache={}
def wrap(*args):
if args not in cache:
cache[args]=func(*args)
return cache[args]
return wrap
#使用memo装饰函数
@memo
def fibonacci(n):
if n<=1:
return 1
return fibonacci(n-1)+fibonacci(n-2)
#使用memo装饰函数等价
#fibonacci=memo(fibonacci)
#题目2:一共有10个台阶的楼梯。从下面走到下面,一次只能迈1-3个台阶。
# 并且不能后退,走完这个楼梯共有多少种走法。
@memo
def climb(n,steps):
cout=0
if n==0:
count=1
elif n>0:
for step in steps:
cout +=climb(n-step,steps)
return count
print (climb(10,(1,2,3)))