1、遞歸為什么耗性能:遞歸的執行方式是通過前一個執行程序執行完成后返回的值進行下一次執行的,所以最終結果會最后執行,可以理解為先進后出。
舉個例子:function fn(n){if(n==0){return 1} return n * fn(n-1)} 比如說現在需要執行fn(3),那么需要先得到fn(2)的結果,同理要執行fn(2)也要先得到fn(1)結果。可以看到fn被調用了三次。
瀏覽器分給程序的執行內存是有限制的,當一個復雜的程序采用遞歸來執行時,可能會出現棧溢出錯誤。所以慎用。
2、可以使用迭代的方式替代遞歸,運行一個循環會比反復調用一個函數的開銷低。
3、解決方案:建立一個緩存對象。
function memoize(fn,cache){//fn遞歸調用的函數,cache緩存對象的預設值
cache = cache || {};
var shell = function(arg){
if(!cache.hasOwnProperty(arg)){//如果緩存數據中沒有這個參數對應的值
cache[arg] = fn(arg);//緩存遞歸執行結果
}
return cache[arg];
}
return shell;
}