memoization(記憶化)
核心理念:減少工作量,避免重複工作,通過模擬緩存技術保存之前的計算結果供後續使用,多用於遞歸算法中。
示例
下面是一個常見的遞歸函數--計算階乘
let factorial = (n) => {
if(n=0){
return 1;
}else{
return n * factorial(n-1);
}
}
考慮代碼中遇到如下實現
let fact6 = factorial(6);
let fact5 = factorial(5);
let fact4 = factorial(4);
在以上代碼執行過程中,遞歸函數被調用了18次,用於計算每一次的階乘結果,然而在計算出 fact6 這個變量的過程中 fact5, fact4 都已經計算過了,如果在計算過程中緩存下每次調用的結果,後面的11次調用就可以縮減爲兩次,減少了很多的重複計算,根據這個思路,就可以對遞歸函數進行優化,加入緩存功能。
代碼實現如下(留疑:0的階乘是多少)
let factorial = (n) => {
factorial.cache = {
'0': 0,
'1': 1
}
if(!factorial.cache.hasOwnproperty(n)){
factorial.cache[n] = n * factorial(n-1);
}
return factorial.cache[n];
}
推薦相關文章
http://www.imooc.com/article/277705?block_id=tuijian_wz