浅显易懂讲解——动态规划(记忆化递归)

1、动态规划

       什么时候使用动态规划呢?

       Those who cannot remember the past well are condemned to repeat it.

       所以动态规划非常适合解决那些具有相同步骤的事(相同子步骤的问题)。

2、举个例子

       从斐波那契数列开始:

        1   1    2    3    5    8    13    21    34 ..........

       上述斐波那契数列就非常符合动态的思想,第一,它有终止条件,也就是数列的第一项和第二项都是1;第二,它有完美的递推表达式,也就是说,从第三项开始,每一项的值等于它前两项的和,也就是F(n)=F(n-1)+F(n-2)。

3、深入分析

      从上述斐波那契数列的递推表达式可知,当我们计算第6项的时候:

      从上图可以看出,里面有些项我们在反复计算,有的项要计算很多次。这对计算机的内存和运行时间都是极大的浪费。因此我们采用动态规划记忆化递归的方式来解之。

4、记忆化递归

def fib(n):
        if(n<=0):
            return "error"
        Memo = []
        Memo[0]=0
        Memo[1]=1
        for i in range(2,n+1):
            Memo.append(Memo[i-1]+Memo[i-2])   
        return Memo[n]

        记忆化递归再求解的时候,我们会把之前的信息记录下来,这样当我们需要每一项的值的时候就不需要重新返回计算,从而大大减少计算量。

猜你喜欢

转载自blog.csdn.net/su_bao/article/details/81181975
今日推荐