關於遞迴和動態規劃的簡單理解

2022-04-28 00:46:51 字數 824 閱讀 3258

簡單的來說,遞迴就是乙個概念能夠用自身來解釋,比如說一本字典,每個字詞的解釋是依靠字典中其他的字詞來解釋的。一般來說,計算機中遇到的遞迴問題大多是把乙個問題分解成規模更小的子問題求解,再進行合併。

乙個具有遞迴性質的問題,大多具有兩個特徵,第乙個是狀態轉移方程也就是遞迴方程,比如在求解階乘時,n!=n*(n-1)!,就將求解n的階乘轉換為求解n-1的階乘。第二個特徵就是終止條件,乙個遞迴是一類問題的求解,必定有乙個結果

無法乙隻遞迴下去,有乙個結束條件,也就是當問題規模簡化的足夠小的時候可以直接的出答案。在求解階乘時,當問題過為1的時候就直接輸出1.

int f(n)

else

}

遞迴執行時,遞迴函式會被反覆地呼叫,一層一層的進入,到達終止條件後,再一層一層出來,為了保證結果的正確性,每一層函式的運算結果和狀態都必須儲存在系統所分配的棧裡面,當資料量很大的時候,遞迴所占用的空間和執行時間會非常恐怖,效率也很低

這裡再介紹一種和遞迴類似的但執行效率更高的動態規劃演算法。

遞迴演算法是從頂置低求解問題,而·動態規劃演算法是從低置頂求解問題,同樣也需要狀態轉移方程方程,和初始條件,相較於遞迴演算法的優勢,動態規劃演算法不需要反覆呼叫自身函式,也不需要儲存每一層函式的狀態,故而時間花費和空間花費都要少的多。

階乘的動態規劃演算法

int f(n)

return array[n];

}

此演算法,無論是時間,還是在空間上都優於遞迴演算法。但是針對某些問題,遞迴演算法**量更少,更好理解,比如漢諾塔,若用動態規劃演算法求解,時間消耗雖遠遠小於遞迴演算法,但實現難度卻也大於遞迴演算法。

遞迴和動態規劃的初步理解

首先通過斐波那契數列引出兩個概念 斐波那契數列 已知f 0 0,f 1 1,f n f n 1 f n 2 分別用兩種不同的思想求得 f n 解決遞迴問題,首先要明確函式定義,然後尋找遞迴終止條件,最後要能夠準確的寫出遞迴子式,即明確遞迴過程。def f n if n 0 return 0if n ...

關於動態規劃的理解

看完原文回到這裡,其實我覺得很多像我這種c語言剛剛入門的人,只理解到了動態規劃的轉移方程,以原文中的例子為例 當minenum 0且people peopleneeded minenum 時 f people,minenum gold minenum 當minenum 0且people people...

遞迴和動態規劃

暴力遞迴 1,把問題轉化為規模縮小了的同類問題的子問題 2,有明確的不需要繼續進行遞迴的條件 base case 3,有當得到了子問題的結果之後的決策過程 4,不記錄每乙個 子問題的解 動態規劃 1,從暴力遞迴中來 2,將每乙個子問題的解記錄下來,避免重複計算 3,把暴力遞迴的過程,抽象成了狀態表達...