js遞迴 記憶函式 動態規劃

2021-09-29 11:54:35 字數 915 閱讀 9267

遞迴在處理某些問題,尤其在迴圈遍歷方面,常常可以用比較簡潔的**實現一些複雜的功能;但是由於它是呼叫自身,所以如果層級比較多,一是效能會比較差,其次容易出現棧溢位;

對於這兩點通過新增乙個變數儲存中間結果可以部分提公升效能,但是還是有上限,尤其是呼叫萬級的次數,還是有棧溢位的風險;乙個例子:關於斐波那契數列的值的獲取;

1 普通遞迴:

var count=0;

//斐波那契數列

var recurfib=function(n)else

}

當n為10的時候,大概需要執行177次,其中100多次的呼叫是重複的;當n為1000的時候,基本上就沒法用了。

2 遞迴+記憶陣列;

var countme=0;

var recurfibmem=function()

return result;

} return fib;

}()

當n為10的時候,大概需要執行19次,相比較原始的方法,少呼叫了很多次。當n=10000的時候,耗時在幾毫秒之間,也還不錯。但是當n的值在往上加,就可能會出現棧溢位的情形;

3 動態規劃:動態規劃從思路上講和新增記憶陣列差不多。區別在於陣列的值不是通過遞迴獲取的,而是通過一步步的「平行」計算獲取的,這樣就不會出現呼叫過深的情況;

//動態規劃

var countd=0;

var recurfibdyn=function(n){

var last=1;

var nextlast=1;

var result=1;

for(var i=2;i測試結果:當n=10000的時候,耗時在2-3毫秒。當n=10w,n=100w,依然可以正常執行且時間沒有指數級別的增加。當然在這裡的話返回的值已經超出了js預設數字的最大值。

js動態規劃與遞迴

動態規劃 從底部開始解決問題,將所有 小問題解決掉,然後合併成乙個整體解決方案,從而解決掉整個大問題 遞迴 從頂部開始將問題分解,通過解決掉所有分解的小問題來解決整個問題 計算斐波那契數列 function recurfib n else 遞迴 很多函式執行了多次 動態規劃使用乙個陣列儲存部分函式計...

SDUT動態規劃 遞迴的函式

遞迴的函式 problem description 給定乙個函式 f a,b,c 如果 a 0 或 b 0 或 c 0 返回值為 1 如果 a 20 或 b 20 或 c 20 返回值為 f 20,20,20 如果 a b 並且 b c 返回 f a,b,c 1 f a,b 1,c 1 f a,b ...

動態規劃 遞迴

動態規劃是求解包含重疊子問題的最優化方法 1.基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解 注意 不是簡單分而治之 2.只能應用於有最優子結構的問題 即區域性最優解能決定全域性最優解,或問題能分解成子問題來求解 3.具有無後效性。它要求每乙個問題的決策,不能夠對解...