高性能javascript讀書筆記之memoization

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章