參考
如果乙個遞迴演算法
需要對相同的子問題進行多次重複計算,那麼我們通常可以採用動態規劃對其進行優化。
動態規劃的具體實現可以分為兩類:一類是自頂向下的備忘錄方法(製表或者記憶),增加乙個子問題解的記錄,每當需要用到乙個子問題的解時,首先檢視這個記錄,如果記錄中存在需要的解,則可直接得到,如果不存在,則遞迴求解,並將結果記錄下來。另一種方法是從遞迴基出發,自底向上的迭代方法,這種方法從最基本的子問題開始求解,並將結果記錄下來,然後利用已經求得的解繼續對高一級的子問題求解,這樣迴圈計算下去,直到解決了最終的問題為止。
斐波那契數列是乙個體現動態規劃方法的簡單問題,下面分別給出原始遞迴演算法、備忘錄方法和迭代方法的原始碼。
原始遞迴演算法,該演算法需要大量重複計算相同子問題:
int fab(int n)
else
}
上述**的時間複雜度為o(2^n),之所以會這麼大,是因為遞迴的時候會重複計算很多次相同的值。
動態規劃的備忘錄方法:
#define size 50
int fab(int n, int m)
else
}int memfab(int n)
return fab(n, m);
}
時間複雜度為o(n),但是該演算法需要o(n)規模的附加空間
動態規劃的迭代方法:
int fab(int n)
else
return f3;
}}
時間複雜度為o(n)
動態規劃 斐波那契數列
問 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0 n 39 斐波那契數列簡單介紹 我的解法 注 從fibonacci n 1 fibonacci n 2 明顯看出使用的是遞迴,此題用遞迴兩三行 即可搞定。但是,若出題者準備著乙個超大的n,那麼很有...
斐波那契數列求解
斐波那契數列是一種常見的數列,其滿足下面兩個條件 f0 f1 1 fn fn 1 fn 2 斐波那契數列求解def fib1 n if n 2 return 1 return fib1 n 1 fib1 n 2 不適用遞迴 python def fib2 n f1 f2 1 for i in ran...
python斐波那契數列動態規劃
斐波那契類似於1 1 2 3 5 8這樣的數列,當前項等於前兩項之和。根據這個規律就可以用遞迴來做,可是當數字很大的時候,遞迴耗時很長,因此可以採用動態規劃來做。動態規劃 deffeibonacci1 n array 0 1 while len array n 1 array 2 return ar...