遞迴:程式呼叫自身,從頂部將問題分解,通過解決掉所有分解出來的小問題,來解決整個問題。
迭代:利用變數的原值推算出變數的乙個新值。遞迴中一定有迭代,但是迭代中不一定有遞迴。
動態規劃:通常與遞迴相反,其從底部開始解決問題。將所有小問題解決掉,進而解決的整個問題。
自上而下呼叫函式本身,速度較慢,不推薦。
要知道第n個數,必須要先知道第n-1和第n-2個數。
而想要知道第n-1個數必須要先知道第n-2和第n-3個數,
想要知道第n-2個數必須要先知道第n-3和第n-4個數。
f(n)
=f(n-1)+f(n-2)
=f(n-2)+f(n-3)+f(n-3)+f(n-4)
=…
int fibonacci(int n)
利用原值去求解下乙個值,一般比遞迴更加快速。
由第乙個數和第二個數去求解第三個數,
由第二個數和第三個數去求解第四個數,
以此類推。
f(3)=f(2)+f(1)
f(4)=f(3)+f(2)
f(5)=f(4)+f(3)
…
int fibonacci(int n)
return answer;
}
動態規劃甚至比迭代還要更快一點,但是採用了空間換時間。
1、級問題的最優解包含了其子問題的最優解,也就是最優子結構性質。
2、有些子問題的可能需要多次計算,即子問題的重疊的性質。
3、子問題的解儲存在一張**裡,這樣每個子問題只用計算一次。
4、需要額外的空間以節省時間。
int fibonacci(int n)
貪心與動態規劃的區別與聯絡
先來看乙個例子 如圖,各結 點代表城市,兩結點間連 線上數字表 示城市間的 距離。試找出從結點a到 結點e的最短距離 貪心 首先,這題如果用貪心來看的話,則為a b2,b2 c4,c4 d2,d2 e,這應該沒有爭議吧 如果硬要挑毛病的話那麼就假設是有向圖,只能往右走 這樣得出來的結果是31,這是貪...
動態規劃 迭代與遞迴
遞迴 好像相對高明,但其實效率而言遞迴並不是最佳方案。迭代 貌似複雜,其實效能更高效。分而治之 所謂動態規劃 就是通過遞迴,找出問題本質,並且給出乙個初步的解之後,再將其等效的轉換為迭代的形式。兩個栗子 1.斐波那契數列 青蛙跳台階 2.最長公共子串行 對序列a 0,n b 0,m lcs a,b ...
DP動態規劃 遞迴迭代
在刷leetcode的時候,因為對dp和遞迴不是很熟,對兩者界限也很模糊。所以看了一些概念以後來寫乙個日記 這是一類問題的定義,解決這類問題的核心在於找到遞推公式 f x f x 1 g n 得到遞推公式之後,如何計算遞推公式存在兩種方法 自頂向下和自底向上 自頂向下 能採用遞迴實現 int fib...