C++ 递归函数
递归的基本概念
递归是编程中一个强大且优雅的概念,它指的是函数直接或间接调用自身的过程。换句话说,递归函数是一个会在其定义中引用自身的函数。
递归解决问题的思路是:
- 将问题分解为更小的同类问题
- 解决这些小问题(通过递归调用)
- 将这些小问题的解决方案组合起来,解决原始问题
理解递归
如果你站在两面相对的镜子之间,你会看到自己的无限倒影。这就像递归函数一样,函数不断调用自身,创建了一种"镜像效果"。
递归函数的基本结构
一个完整的递归函数通常由两部分组成:
- 基本情况(Base Case):当问题简单到可以直接解决时的条件,也称为"递归出口"。
- 递归情况(Recursive Case):将问题分解为更小的子问题,并调用自身来解决。
返回类型 递归函数名(参数列表) {
// 基本情况:递归的终止条件
if (终止条件) {
return 基本情况的值;
}
// 递归情况:调用自身
else {
return 递归调用自身(更小的问题);
}
}
递归的工作原理
让我们通过计算阶乘的例子来理解递归的工作原理。
阶乘定义:n! = n × (n-1) × (n-2) × ... × 2 × 1
int factorial(int n) {
// 基本情况
if (n == 0 || n == 1) {
return 1;
}
// 递归情况
else {
return n * factorial(n - 1);
}
}
int main() {
std::cout << "5! = " << factorial(5) << std::endl;
return 0;
}
输出:
5! = 120
递归调用栈过程分析
当我们调用 factorial(5)
时,发生了以下过程:
每次递归调用都会在内存中的栈上分配空间,直到达到基本情况。然后,函数开始"返回",计算在栈中累积的表达式。