记忆化解决纯函数重复调用导致的高开销计算问题,如递归斐波那契;通过缓存参数与结果映射,避免指数级重复运算,常用对象或Map实现,仅适用于无副作用的纯函数。

记忆化(Memoization)是一种用空间换时间的优化技术,它把函数已计算过的输入和对应结果缓存起来,当相同输入再次出现时,直接返回缓存结果,跳过重复计算。
记忆化解决什么问题
它主要应对纯函数中重复调用、高开销计算的场景。比如递归求斐波那契数列、解析复杂表达式、频繁调用的数学变换等——这些函数若无缓存,可能指数级重复运算。
基本实现方式
核心是用一个对象或 Map 存储 参数 → 返回值 的映射。常见做法是在函数外部维护缓存,或用闭包封装:
- 对单参数函数,可用普通对象:key 直接用参数字符串化(如
JSON.stringify(arg)),但要注意原始类型可直接用作 key - 多参数函数推荐用 Map,避免字符串化开销和歧义;也可将参数数组作为 key(Map 支持数组作键)
- 注意只对纯函数使用——输入相同必须输出相同,且无副作用
实际应用示例
以斐波那契为例:
立即学习“Java免费学习笔记(深入)”;
function fib(n) {
if (n <= 1) return n;
return fib(n - 1) + fib(n - 2);
}未记忆化时,fib(40) 会调用数十万次;加记忆化后变成线性时间:
function memoFib() {
const cache = new Map();
return function(n) {
if (cache.has(n)) return cache.get(n);
if (n <= 1) return n;
const result = memoFib()(n - 1) + memoFib()(n - 2);
cache.set(n, result);
return result;
};
}更实用写法是封装成高阶函数:const memoizedFib = memoize(fib),复用逻辑。
注意事项与边界
记忆化不是万能的:
- 缓存会持续占用内存,长期运行需考虑清理策略(如 LRU、超时失效)
- 参数含函数、对象、日期等引用类型时,浅比较会失效,需自定义 key 生成逻辑
- 异步函数需配合 Promise 缓存(缓存的是 Promise 实例,避免重复发起请求)
- 不适用于有副作用或依赖外部状态的函数











