基准条件是递归方法的强制性守门人,必须在入口立即判断;若未满足则抛出stackoverflowerror,普通场景阈值≤500,已知深度≤100时建议设为200。

在 Java 方法递归调用中,基准条件(Base Case)不是“可选的退出开关”,而是控制递归层级的强制性守门人。它必须在每次调用入口立即生效,确保栈深度可控、逻辑可终止。
基准条件必须放在方法最开头
递归方法一进入就要判断是否该停止,不能先做计算、遍历或状态变更再检查。否则可能在无效输入下持续压栈。
- 正确写法:if (n —— 紧贴方法签名后,不执行任何递归操作
- 错误写法:int result = doSomething(); if (n —— 已消耗栈帧,且 result 可能无意义
- 特别注意 null、空集合、越界索引等非法输入,它们比 n == 0 更早需要拦截
参数变化方向必须严格收敛到基准情形
每次递归调用传入的新参数,要让问题规模单调减小,并确定能抵达你设定的基准值。
- 处理数组时用 process(arr, i + 1),就得配 if (i >= arr.length)
- 遍历链表用 process(node.next),前提必须是 node != null && node.next != null
- 避免误写 factorial(n + 1) 或浮点步进(如 x -= 0.1),这些会导致永远无法命中 x == 0
每个分支路径都得有独立出口检查
多条件结构(if-else / switch / 三元表达式)中,不能只在顶层判一次,而要确保每条执行流都能触达基准条件。
- 树遍历中,左子树递归前检查 node.left != null,右子树同样单独检查
- 状态机类递归(如解析嵌套括号),每个状态转移都要定义自己的退出条件,不能依赖初始输入判断
- 避免在 try-catch 或 finally 块中隐式触发二次递归,这会绕过主流程的基准校验
加深度守卫作为双保险
即使基准逻辑完全正确,恶意输入或异常数据仍可能导致意外深递归。引入显式深度计数可快速失败、暴露问题。
- 方法签名增加 int depth 参数,入口立即校验:if (depth > 200) throw new StackOverflowError("Recursion too deep");
- 普通业务场景阈值设 ≤500;已知结构深度≤100的,建议设为200——既留余量,又足够敏感
- 这个守卫不替代基准条件,而是补漏机制:它不修复逻辑缺陷,但防止服务被拖垮
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











