斐波那契数列&&上台阶

使用装饰器的场景

 当我们想对多个函数增加一个相同的功能时,例如计数统计,缓存计算结果,记录日志等


# coding:utf-8
# 【题目1】
# 斐波那契数列 又称黄金分割数列,指的是这样的一个数列 1,1,2,3,5,8,13,21,,,
# 这个数列从第三项开始,每一项都等于签名的2项和,求数列的第n项

def memo(func):
    cashe={}
    def wrap(*args):
        if args not in cashe:
            cashe[args]=func(*args)
        return cashe[args]
    return wrap


@memo
def fi(n):
    if n<=1:
        return 1
    return fi(n-1) + fi(n-2)

# print fi(5)
# 【题目2】
# 一个共有10个台阶的楼梯,从下面走到上面,一次只能迈1-3个台阶,并且不能后退,走完所有的台阶共有多少种方法
当有n个台阶时,在上n台阶之前一步,如果是一次上三个台阶 就有f(n-3)中方法 如果一次上2个台阶就有f(n-2)中方法,如果一次上1个台阶剩下的就有f(n-1)种方法
n=1时 c=1
n=2 c=2
n=3 c=4
n=4 
 (1)第一步迈1个台阶 剩下3步 f(n-1)=f(3)=4
(2)第一步迈2个台阶 剩下2步 f(n-2)=f(2)=2
(3)第一步迈3个台阶 剩下1步 f(n-3)=f(1)=1
c=f(n-3)+f(n-2)+f(n-1)
......
@memo
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
@memo
def climb2(n):
    count=0
    if n<=1:
        count=1
    elif n==2:
        count=2
    elif n>2:
        count=climb2(n-1)+climb2(n-2)+climb2(n-3)
    return count
print  climb(10,(1,2,3))
print  climb2(10)

  

原文地址:https://www.cnblogs.com/alasijia/p/11239964.html