函数的特殊形式——递归函数
C++递归函数入门指南:从概念到实践
1. 什么是递归?
递归是指函数直接或间接调用自身的过程,就像照镜子时影像无限反射,通过不断分解问题解决问题
适用场景:
- 问题可分解为相同子问题(如阶乘、斐波那契数列)
- 需要处理嵌套结构(如树、链表)
2. 递归的两个核心要素
- 基准条件(Base Case):递归的终止条件,防止无限循环。
示例:计算阶乘时,0! = 1
是基准条件 - 递归步骤(Recursive Step):将问题分解为更小的子问题,并调用自身解决。
示例:n! = n * (n-1)!
,每次调用缩小问题规模
3. 递归的执行流程
以计算 5!
为例:
int factorial(int n) {
if (n == 0) return 1; // 基准条件
return n * factorial(n - 1); // 递归步骤
}
执行过程:
factorial(5)
→5 * factorial(4)
factorial(4)
→4 * factorial(3)
- ...
factorial(1)
→1 * factorial(0)
factorial(0)
返回1
(基准条件)- 逐层返回计算:
1 → 1 * 1=1 → 2 * 1=2 → 3 * 2=6 → 4 * 6=24 → 5 * 24=120
1
5
4. 递归的优缺点
- 优点:
- 代码简洁,逻辑清晰(如汉诺塔、二叉树遍历)
- 缺点:
- 效率低(重复计算);
5. 经典递归问题示例
示例1:计算阶乘
#include <iostream>
using namespace std;
int factorial(int n) {
if (n == 0) return 1; // 基准条件
return n * factorial(n - 1); // 递归步骤
}
int main() {
cout << "5! = " << factorial(5) << endl; // 输出 120
return 0;
}
代码解读:
- 基准条件:
n == 0
时返回1
; - 递归步骤:
n! = n * (n-1)!
6. 如何设计递归函数?
- 确定基准条件:最简单的情况,直接返回结果。
- 分解问题:将问题拆分为更小的子问题。
- 缩小规模:每次递归调用使问题更接近基准条件。
总结
递归是解决问题的强大工具,但需谨慎使用:
- 合理设计基准条件,避免无限递归;
- 注意递归深度,防止栈溢出;