高性能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

点赞