斐波那契数列里面的东西?

斐波那契数列

我想每个人都会写斐波那契数列吧!!

斐波那契数列的定义

f(0) = 1,f(1) = 1,f(n) = f(n-1) + f(n-2)

基于递归的方式实现,讲到递归都会用到:

def fib_sequence(n):
    def fib_rec(n):
        if n == 0 or n ==1:
            return n
        return fib_rec(n-1) + fib_rec(n-2)

    list = []
    for i in range(n):
        list += [fib_rec(i)]
        
    return list

斐波那契数列也是动态规划的常用范例,这个例子相当于直接告诉你了递推公式,子问题已经帮助你分解了。但是递归调用,出现了多个子问题重复,我们需要想办法优化,如何优化递归了?比较常用的基于递归,我们记录子问题的结果,假如调用到重复子问题就直接引用以计算的结果,这个就是备忘模型,因为还是基于递归,所以是自顶向下设计的:

def fib_top_down_(n):
    list = [-1]*(n)
    list[0] = 0
    list[1] = 1
    def fib_top_down(n):
        if list[n] == -1:
            list[n] = fib_top_down(n-1)+fib_top_down(n-2)
        return list[n]
    fib_top_down(n-1)
    return list

自顶向下设计,出现了多个子问题重复,我们需要想办法优化,还有一种可以优化的办法:遍历计算每一下子问题,从最小的子问题开始计算,这样就可以避免重复计算,这就是我们一般使用的迭代的方法,所以是基于自底向上推理的,又叫演绎模型:

#%%        
def fib_botton_up_(n):
    list = [0,1]
    for i in range(2,n):
        list.append(list[i-1] + list[i-2])
        
    return list

运行结果:

#%%
print fib_sequence(20)
#%%
print fib_top_down_(20)
#%%
print fib_botton_up_(20)

runfile('/root/test/dynamic_program.py', wdir='/root/test')
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]

猜你喜欢

转载自blog.csdn.net/weixin_40759186/article/details/83929328