1. 程式人生 > >淺顯易懂講解——動態規劃(記憶化遞迴)

淺顯易懂講解——動態規劃(記憶化遞迴)

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]

        記憶化遞迴再求解的時候,我們會把之前的資訊記錄下來,這樣當我們需要每一項的值的時候就不需要重新返回計算,從而大大減少計算量。