动态规划和递归算法求解斐波那契数列的效率对比

五迷三道 提交于 2020-02-16 12:05:52

动态规划有效的解决了递归算法的效率低下的问题,它剔除了递归中的重叠的子问题,对每个子问题只求解一次。

斐波那契数列格式为:1、1、2、3、5、8、13、21、34、......,
递归(状态转移)函数为 f[n]=f[n-1]+f[n-2]

采用递归求解:

#采用递归求解
def f_recu(n):
    assert isinstance(n,int),'必须输入一个整数'
    assert n>=1,'不能小于1'
    if n==1 or n==2:
        return 1
    return f_recu(n-1) + f_recu(n-2)
#测试,n=40 计算时间
%time f_recu(40)

输出:

Wall time: 48.4 s
102334155

采用动态规划求解:

#采用动态规划方法求解
def f_dyna(n):
    assert isinstance(n,int),'必须输入一个整数'
    assert n>=1,'不能小于1'
    if n == 1 or n==2:
        return 1
    else:
        pre_n_2 = 1
        pre_n_1 = 1
        for i in range(3,n+1):
            target_n = pre_n_2 + pre_n_1
            pre_n_1 = pre_n_2
            pre_n_2 = target_n
        return target_n
#测试,n=40 计算时间
%time f_dyna(40)

输出:

Wall time: 0 ns
102334155

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!