C++ 函数进阶:递归与尾递归优化
一、学习目标与重点
- 掌握递归函数的定义、核心原理及适用场景
- 理解递归的'递推 - 回归'过程,能够独立编写正确的递归代码
- 识别递归的常见问题(栈溢出、重复计算)并掌握解决方案
- 了解尾递归的概念、优化原理及在 C++ 中的实现方式
- 能够根据实际场景选择递归或迭代,提升代码效率
核心重点:递归的终止条件设计、尾递归与普通递归的区别、栈溢出问题的规避
二、递归函数基础认知
2.1 什么是递归函数
递归函数是指在函数体内部直接或间接调用自身的函数,它是解决复杂问题的重要编程思想,核心是'分而治之'——将大问题拆解为结构相同的小问题,直到小问题可直接求解(终止条件),再逐步回归得到原问题的答案。
生活中的递归案例:
- 俄罗斯套娃:大娃娃里套小娃娃,直到最小的娃娃(终止条件),再逐个打开回归
- 阶乘计算:n! = n × (n-1)!,直到 0! = 1(终止条件)
- 斐波那契数列:F(n) = F(n-1) + F(n-2),直到 F(0)=0、F(1)=1(终止条件)
2.2 递归函数的三大要素
编写递归函数必须满足以下三个条件,否则会导致无限递归(最终栈溢出):
- 终止条件:明确递归何时停止,返回确定值(避免无限循环)
- 递归表达式:将原问题拆解为更小的子问题,子问题与原问题结构一致
- 收敛性:每次递归调用都使问题规模缩小,最终趋近于终止条件
警告:缺少终止条件或递归表达式不收敛,会导致函数无限调用自身,栈内存耗尽后触发 stack overflow 错误。
2.3 递归函数的执行过程
递归的执行过程分为两个阶段:递推阶段和回归阶段:
- 递推阶段:函数不断调用自身,将大问题拆解为小问题,直到触发终止条件
- 回归阶段:从终止条件开始,逐步返回子问题的结果,最终得到原问题的答案
示例:计算 n 的阶乘(n! = 1×2×3×…×n)
#include <iostream>
using namespace std;
// 递归计算 n 的阶乘
int factorial(int n) {
// 终止条件:0! = 1,1! = 1
if (n <= 1) {
return 1;
}
// 递归表达式:n! = n × (n-1)!
return n * factorial(n - 1);
}
int {
n = ;
cout << n << << (n) << endl;
;
}


