JavaScript 高级技巧 Memoization

JavaScript 高级技巧 Memoization:https://segmentfault.com/a/1190000016703106

总结:缓存函数调用结果

// 实现阶乘

//不使用 memoization
//不假思索,我们会立即写下如下的代码:
const factorial = n => {
    if (n === 1) {
        return 1
    } else {
        return factorial(n - 1) * n
    }
};

//使用 memoization 
<font color="red">(原理:就是用一个数组变量记录函数执行结果,执行函数时先查询在变量里是否存在对应的值,如果存在则直接返回结果,不存在则去执行函数计算)</font>
const cache = []
const factorial = n => {
    if (n === 1) {
        return 1
    } else if (cache[n - 1]) {
        return cache[n - 1]
    } else {
        let result = factorial(n - 1) * n
        cache[n - 1] = result
        return result
    }
};

//使用 闭包 和 memoization
//常见的方式就是 闭包 和 memoization 一起搭配使用:
const factorialMemo = () => {
    const cache = []
    const factorial = n => {
        if (n === 1) {
            return 1
        } else if (cache[n - 1]) {
            console.log(`get factorial(${n}) from cache...`)
            return cache[n - 1]
        } else {
            let result = factorial(n - 1) * n
            cache[n - 1] = result
            return result
        }
    }
    return factorial
};
const factorial = factorialMemo();

//继续变形,下面这种编写方式是最常见的形式。
const factorialMemo = func => {
    const cache = []
    return function(n) {
        if (cache[n]) {
            console.log(`get factorial(${n}) from cache...`)
            return cache[n]
        } else {
            const result = func.call(this, n)
            cache[n] = result
            return result
        }
    }
}
const factorial = factorialMemo(function(n) {
    return n === 1 ? 1 : factorial(n - 1) * n
});

// 从阶乘的这个例子可以知道 memoization 是一个空间换时间的方式,存储执行结果,下次再次发生相同的输入会直接输出结果,提高了执行的速度。
原文地址:https://www.cnblogs.com/myc-xiaochaochao/p/13968477.html