java递归配合备忘录模式核心是“算过就记、再用就查”,用static map或传入缓存对象存储子问题结果,key为参数组合,value为结果;推荐computeifabsent保证线程安全与语义清晰;缓存须在递归外初始化,base case需优先判断。

Java 方法在递归中配合备忘录模式,核心就是“算过就记、再用就查”——用一个外部容器缓存已计算的子问题结果,让每次递归调用先查缓存,命中则直接返回,不命中才真正计算并存入缓存。
用 Map 做通用缓存容器
推荐使用 static Map
- 用 ConcurrentHashMap 可支持多线程安全(如并发调用同一递归方法)
- 用 computeIfAbsent 一行完成“查+算+存”,语义清晰且线程安全:
map.computeIfAbsent(n, key -> fib(key - 1) + fib(key - 2));
注意缓存初始化与作用域
缓存必须在递归调用链外初始化,否则每次进入方法都会重置,起不到记忆效果。
- 静态成员变量:适合整个类生命周期内复用(如工具类中的 fib())
- 局部变量 + 参数传递:适合需要隔离状态的场景(如不同输入范围、不同业务上下文)
- 避免用局部非 static Map:它会在每次方法调用时重建,缓存失效
终止条件仍需独立判断
备忘录不替代递归逻辑本身。基础 case(如 n ≤ 1)必须在查缓存前就处理,否则可能陷入无效查询或空指针。
- 正确顺序:先判 base case → 再查缓存 → 最后递归计算并存值
- 错误写法:把 base case 放在缓存之后,会导致对 n=0/1 也去 map 查,多余且易出错
适配多参数递归场景
当递归方法有多个参数(如 rodCutting(length, prices)),不能直接用 int 做 key。可选方案:
- 拼接字符串:key = length + "," + prices.hashCode()(简单但注意哈希冲突)
- 封装轻量键类:实现 equals + hashCode,类型安全、语义明确
- 用 Pair / record(Java 14+):record Key(int len, List
p) {}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











