递归调用的核心是将大问题拆解为同结构的小问题,需明确定义基础情况和递推关系;阶乘递归为n!=n×(n−1)!,基础情况n≤1时返回1;斐波那契朴素递归f(n)=f(n−1)+f(n−2),基础情况f(0)=0、f(1)=1,但时间复杂度达o(2ⁿ)。

递归调用的核心在于“把大问题拆成同结构的小问题”,只要定义好基础情况(base case)和递推关系(recursive case),阶乘、斐波那契、树形查找就能写得简洁又易懂。
阶乘:最典型的线性递归
阶乘 n! = n × (n−1)!,自然对应递归:当前值乘以更小规模的阶乘结果。关键是要及时终止,否则栈溢出。
- 基础情况:当 n ≤ 1 时,直接返回 1(0! = 1! = 1)
- 递推逻辑:return n * factorial(n - 1)
- 注意避免负数输入——加个 guard 判断更健壮
斐波那契:理解重复计算与优化空间
原始递归 f(n) = f(n−1) + f(n−2) 很直观,但时间复杂度是指数级 O(2ⁿ),因为大量子问题被反复求解。
- 基础情况:f(0)=0,f(1)=1
- 朴素写法够清晰,适合教学或 n 很小时(比如 n
- 如需高效,可改用记忆化(缓存已算过的 f(k))或转为迭代——递归本身不是瓶颈,重复计算才是
树形查找:天然契合递归结构
树的定义就是递归的:一个节点 + 若干子树。查找操作只需在当前节点判断,再递归查左/右子树即可。
- 基础情况:节点为空(null/None),说明没找到
- 命中判断:当前节点值等于目标值,直接返回该节点
- 否则递归查找左子树;没找到再递归查找右子树(或按 BST 规则只查一侧)
- 返回值要逐层透传——递归调用的结果就是整个函数的结果
不复杂但容易忽略:每次递归都要确保朝 base case 收敛,参数必须变小(阶乘减一、斐波那契降序、树向下深入),否则会无限调用。











