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 是一个空间换时间的方式,存储执行结果,下次再次发生相同的输入会直接输出结果,提高了执行的速度。