递归函数优化核心是减少临时对象创建和内存占用。应复用StringBuilder、集合等对象,通过参数传递而非重复new;采用记忆化缓存重叠子问题结果;优先转为迭代+显式栈以精确控制对象生命周期。

递归函数中减少临时对象创建,核心是避免在每次递归调用中重复分配新对象,尤其要控制字符串、集合、包装类等易被高频创建的类型。内存优化则需从栈空间和堆空间两方面入手:压低递归深度、复用中间状态、消除重复计算。
避免循环内反复新建对象
递归体中若出现类似 new ArrayList()、new StringBuilder() 或字符串拼接(如 "a" + i),每次调用都会生成新实例,迅速推高堆内存压力。
- 把可复用的对象作为参数传入递归函数,而不是在函数体内创建
- 对字符串拼接,改用
StringBuilder并在最外层初始化,通过引用传递进去 - 集合类尽量复用已有实例,清空后重用(如
list.clear()),而非每次new
用累加参数替代中间对象构造
例如遍历树生成路径字符串,传统写法可能每层都拼新字符串;优化后可传入一个 StringBuilder 参数,在递归过程中追加和回溯:
- 进入子节点前
sb.append("/").append(node.val) - 递归返回后
sb.setLength(sb.length() - String.valueOf(node.val).length() - 1)回退 - 全程只用一个
StringBuilder实例,避免 N 层调用产生 N 个字符串对象
启用记忆化缓存已计算结果
适用于存在重叠子问题的场景(如斐波那契、树形 DP)。缓存能直接减少递归分支数量,从而降低调用次数和对象创建频次。
- 使用
Map或数组保存输入参数与返回值的映射 - 递归开始先查缓存,命中则直接返回,跳过后续对象构造和计算逻辑
- 注意缓存键的设计:避免用易变对象(如未重写
equals/hashCode的自定义类)作 key
优先转为迭代+显式栈
彻底规避 JVM/PHP 解释器隐式栈帧膨胀,同时便于手动管理对象生命周期。
- 用
Deque或Stack存储待处理状态(如节点+当前路径、剩余参数等) - 循环中每次 pop 一个状态,处理并 push 子状态——所有对象均可复用或按需创建
- 相比原生递归,栈帧不再由语言运行时自动管理,堆上对象也更容易复用(比如复用同一份
StringBuilder)

















