递归函数必须包含递归出口和递归公式两个部分:递归出口是终止条件,用于避免无限调用;递归公式则将大问题转化为更小规模的同类问题,并确保参数向出口收敛。

递归函数的核心在于两个必要组成部分:**递归出口(也叫基准情形、终止条件)** 和 **递归公式(也叫递归关系、递推式)**。它们共同保证递归能正确开始、逐步推进,并最终结束,避免无限调用。
递归出口:函数停止递归的明确条件
递归出口是递归调用链的“终点”,是一个无需再调用自身的简单情形,直接返回确定结果。它通常对应问题的最小、最原始规模。
- 必须存在,且至少有一个;否则函数会无限调用自身,导致栈溢出
- 应放在函数开头优先判断,确保每次调用都先检查是否该终止
- 常见形式是判断输入参数是否达到边界值,如 n == 0、n == 1、list 为空、指针为 null
例如阶乘函数中:if n == 0 or n == 1: return 1 就是递归出口——0! 和 1! 的值已知,无需继续分解。
递归公式:将大问题转化为更小同类问题的规则
递归公式描述了如何把当前规模的问题,用更小规模的相同问题来表达。它体现“分而治之”的思想,是递归函数的主体逻辑。
- 右侧必须包含对自身更小输入的调用,且参数要向递归出口靠近(如 n → n−1,list → list[1:])
- 需结合当前层的计算,把子问题结果组装成原问题答案
- 不能跳过或绕开递归出口,否则可能无法收敛
例如阶乘的递归公式是:return n * factorial(n - 1)——n! = n × (n−1)!,把求 n! 转为求 (n−1)!,规模减小 1。
二者配合:构成完整递归逻辑
递归出口和递归公式不是孤立的,而是协同工作的动态过程:
- 每次调用先触达出口判断;未满足则执行递归公式,发起下一层调用
- 调用层层深入,参数不断简化,直到触发出口,开始逐层返回
- 返回过程中,各层利用子问题结果完成自己的计算,最终得到原始问题解
就像走楼梯:出口是地面层(不再往下),公式是“下一级台阶”,只有明确哪层是底(出口),并保证每步都确实向下(公式合理),才能安全抵达并返回。











