关键在于明确终止条件、控制递归深度、避免重复计算及提前校验输入;终止条件须覆盖所有路径,优先用整数计数或空结构判断,如数组以长度为0或索引越界、树以节点为null为终止依据。

关键在于明确终止条件、控制递归深度、避免重复计算,以及提前校验输入。
设置清晰且必然触发的终止条件
终止条件必须覆盖所有可能的输入路径,并确保每次递归调用都更接近该条件。避免依赖外部状态或浮点数比较,优先使用整数计数或空结构判断。
- 对数组/字符串递归:以长度为0或索引越界作为终止依据
- 对树结构递归:以节点为null为终止依据
- 避免写成if (n == 1) return 1;却忘了n≤0的情况,应改为if (n
限制递归最大深度并提供安全兜底
尤其在处理用户输入或不确定规模的数据时,主动设限可防止栈溢出。可在参数中传入剩余深度,或使用静态/全局计数器(注意多线程安全)。
- 函数入口处检查当前深度是否超过阈值(如1000),超限则抛异常或返回默认值
- Python可用sys.setrecursionlimit()调整上限,但不推荐代替逻辑防护
- 对深度敏感场景(如解析嵌套JSON),建议改用显式栈模拟递归
避免隐式状态与重复计算
递归函数应尽量纯(无副作用、输出仅依赖输入)。重复计算不仅低效,还可能因缓存缺失导致深层调用失控。
- 斐波那契等经典问题务必加记忆化(如用字典缓存已算结果)
- 不要在递归中修改全局变量或闭包变量来“记住”状态,容易引发逻辑错乱
- 若需维护状态,显式作为参数传递,保持调用关系清晰可追溯
输入预检与类型防护
递归前验证输入合法性,能提前拦截非法输入引发的无限分支。例如负数阶乘、非整数索引、环形链表等。
- 检查参数类型是否符合预期(如是否为正整数、是否为有效引用)
- 对图或链表结构,预先检测是否存在环(可用快慢指针或访问标记)
- 对字符串或数组操作,确认索引范围不越界,避免因错误偏移进入无效递归分支











