记忆函数(Memoization)是一种用于长递归或长迭代操作性能优化的编程实践。
记忆函数实现原理:使用一组参数初次调用函数时,缓存参数和计算结果,当再次使用相同的参数调用该函数时,直接返回相应的缓存结果。
注意: 记忆化函数不能有副作用。
以求解 fibonacci 数为例演示记忆函数
普通递归版
function fibonacci(n) {
console.log(`calculate fibonacci(${n})...`)
if (n < 2) {
return 1;
} else {
return fibonacci(n - 2) + fibonacci(n - 1);
}
}
复制代码
记忆递归版
const memoizedFibonacci = (function () {
const cache = {} // 计算结果缓存
return function fibonacci(n) {
// 不同的参数按一定的规则计算得到不同的缓存键值
const key = n
// 每次执行时首先检查缓存
// 若当前参数的计算结果已有缓存,直接返回缓存结果
if (cache[key]) {
return cache[key]
}
// 否则,计算、缓存并返回结果
console.log(`calculate fibonacci(${n})...`)
if (n < 2) {
return cache[key] = 1;
} else {
return cache[key] = fibonacci(n - 2) + fibonacci(n - 1);
}
}
})()
复制代码
执行过程对比
// 依次执行下述语句,观察输出
fibonacci(3);
/**
* execution-log:
* calculate fibonacci(3)...
* calculate fibonacci(1)...
* calculate fibonacci(2)...
* calculate fibonacci(0)...
* calculate fibonacci(1)...
*
* return-value:
* 3
*/
fibonacci(5);
/**
* execution-log:
* calculate fibonacci(5)...
* calculate fibonacci(3)...
* calculate fibonacci(1)...
* calculate fibonacci(2)...
* calculate fibonacci(0)...
* calculate fibonacci(1)...
* calculate fibonacci(4)...
* calculate fibonacci(2)...
* calculate fibonacci(0)...
* calculate fibonacci(1)...
* calculate fibonacci(3)...
* calculate fibonacci(1)...
* calculate fibonacci(2)...
* calculate fibonacci(0)...
* calculate fibonacci(1)...
*
* return-value:
* 8
*/
/* ------------------------------- */
memoizedFibonacci(3);
/**
* execution-log:
* calculate fibonacci(3)...
* calculate fibonacci(1)...
* calculate fibonacci(2)...
* calculate fibonacci(0)...
*
* return-value:
* 3
*/
memoizedFibonacci(5);
/**
* f