遞歸和動態規劃

遞歸算法就是經過解決同一問題的一個或多個更小的實例來最終解決一個大問題的算法。爲了在C語言中實現遞歸算法,經常使用遞歸函數,也就是說能調用自身的函數。遞歸程序的基本特徵:它調用自身(參數的值更小),具備終止條件,能夠直接計算其結果。算法

      在使用遞歸程序時,咱們須要考慮編程環境必須可以保持一個其大小與遞歸深度成正比例的下推棧。對於大型問題,這個棧須要的空間可能妨礙咱們使用遞歸的方法。編程

     一個遞歸模型爲分治法,最本質的特徵就是:把一個問題分解成獨立的子問題。若是子問題並不獨立,問題就會複雜的多,主要緣由是即便是這種最簡單算法的直接遞歸實現,也可能須要不可思議的時間,使用動態規劃技術就能夠避免這個缺陷。數組

     例如,斐波那契數列的遞歸實現以下:函數

    int F(int i)工具

    {設計

             if(i < 1)  return 0;遞歸

             if(i == 1) return 1;開發

              return F(i-1) + F(i - 2);效率

    }程序

    千萬不要使用這樣的程序,由於它的效率極低,須要指數級時間。相比之下,若是首先計算前N個斐波那契數,並把它們存儲在一個數組中,就能夠使用線性時間(與N成正比)計算F。

 

      F[0] = 0;F[1] = 1;

      for(i = 2; i <= N; i++)

            F[i] = F[i-1] + F[i-2];

     這個技術給了咱們一個獲取任何遞歸關係數值解的快速方法,在斐波那契數的例子中,咱們甚至能夠捨棄數組,只須要保存前兩個值。

     由上面的討論咱們能夠得出這樣的結論:咱們能夠按照從最小開始的順序計算全部函數值來求任何相似函數的值,在每一步使用先前已經計算出的值來計算當前值,咱們稱這項技術爲自底向上的動態規劃。只要有存儲已經計算出的值的空間,就能把這項技術應用到任何遞歸計算中,就能把算法從指數級運行時間向線性運行時間改進。

    自頂向下的動態規劃甚至是一個更簡單的技術,這項技術容許咱們執行函數的代價與自底向上的動態規劃同樣(或更小),可是它的計算是自動的。咱們實現遞歸程序來存儲它所計算的每個值(正如它最末的步驟),並經過檢查所存儲的值,來避免從新計算它們的任何項(正如它最初的步驟)。這種方法有時也稱做爲備忘錄法。

                       斐波那契數(動態規劃)

經過把所計算的值存儲在遞歸過程的外部數組中,明確地避免重複計算。這一程序計算的時間與N成正比。

                  int F(int i)

                  {

 

                          if(knownF[i] != unknown)

                                 return knownF[i];

                          if(i == 0) t = 0;

                          if(i == 1) t = 1;

                          if(i > 1)  t = F(i - 1) + F(i - 2);

                          return knownF[i] = t;

                  }

 

 

       性質:動態規劃下降了遞歸函數的運行時間,也就是減小了計算全部小於或等於給定參數的遞歸調用所要求的時間,其中處理一次遞歸調用的時間爲常量。

       咱們不須要把遞歸參數限制到單整形參數的狀況。當有一個帶有多個整形參數的函數時,能夠把較小子問題的解存儲在多維數組中,一個參數對應數組的一維。其餘那些徹底不涉及整形參數的情形,就使用抽象的離散問題公式,它能讓咱們把問題分解爲一個個的小問題。

      在自頂向下的動態規劃中,咱們存儲已知的值;在自底向上的動態規劃中,咱們預先計算這些值。咱們經常選擇自頂向下的動態規劃而不選自底向上動態規劃,其緣由以下:

     1 自頂向下的動態規劃是一個天然的求解問題的機械轉化。

     2 計算子問題的順序能本身處理。

     3 咱們可能不須要計算全部子問題的解。

     咱們不能忽視相當重要的一點是,當咱們須要的可能的函數值的數目太大以致於不能存儲(自頂向下)或預先計算(自底向上)全部值時,動態規劃就會變得低效。自頂向下動態規劃確實是開發高效的遞歸算法實現的基本技術,這類算法應歸入任何從事算法設計與實現所需的工具箱。

相關文章
相關標籤/搜索