闭包实现带缓存的递归斐波那契函数,通过内部Map缓存已计算结果,递归调用自身以复用缓存,避免重复计算,且支持多实例独立缓存。

用闭包实现带缓存的递归斐波那契,核心是把记忆化(memoization)逻辑封装在闭包内,让每次调用都复用已计算结果,避免重复递归。
闭包封装缓存对象
闭包的作用是维持一个私有的缓存对象(比如 plain object 或 Map),它在函数多次调用间持续存在,但对外不可见。这样既保护了缓存数据,又支持高效查找。
- 缓存键通常用参数字符串化(如
n.toString()),简单场景用数字作键也行 - 推荐用
Map而非普通对象,避免原型链干扰和类型隐式转换问题 - 闭包返回的是“记忆化后的斐波那契函数”,不是原始递归函数本身
递归函数内部查缓存再计算
实际执行的递归函数会先查缓存:命中则直接返回;未命中则递归计算,存入缓存后再返回。注意递归调用的仍是这个带缓存的函数自身,而不是原始无缓存版本。
- 基础情形(
n === 0 || n === 1)直接返回,不走缓存逻辑更清晰 - 递归调用必须调用闭包返回的函数名(比如
fib(n-1)),才能延续缓存能力 - 不要在递归里重新创建闭包,否则每次递归都新建缓存,失去优化意义
完整可运行示例
下面是一个简洁、可直接使用的实现:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
const memoFib = (() => {
const cache = new Map();
const fib = (n) => {
if (n < 0) return NaN;
if (n <= 1) return n;
if (cache.has(n)) return cache.get(n);
const result = fib(n - 1) + fib(n - 2);
cache.set(n, result);
return result;
};
return fib;
})();
使用方式:memoFib(50) 瞬间返回,而裸递归会卡顿。第一次调用后,cache 已存下所有中间值,后续同参数调用都是 O(1) 查表。
扩展:支持重置缓存或多个独立实例
如果需要清空缓存或为不同用途创建隔离缓存,可以把闭包做成工厂函数:
const createMemoFib = () => {
const cache = new Map();
const fib = (n) => {
if (n <= 1) return n;
if (cache.has(n)) return cache.get(n);
cache.set(n, fib(n - 1) + fib(n - 2));
return cache.get(n);
};
fib.clear = () => cache.clear();
return fib;
};
<p>const fib1 = createMemoFib();
const fib2 = createMemoFib(); // 独立缓存
fib1(10); // 缓存只影响 fib1
fib2.clear(); // 只清空 fib2 的缓存</p>这种写法更灵活,适合模块化或测试场景。

















