📘阶乘递归

2026-09-05
⭐ GESP 3级

📖概念讲解

【考点 · 3级】阶乘递归 —— 递归函数的经典入门题型,属于函数与递归类。

【说人话】递归就是函数自己调用自己。阶乘 n! 的定义天然是递归的:n! = n × (n-1)!,而 0! = 1 是递归出口(base case)。写递归记住两件事:① 找到终止条件,否则栈溢出;② 每次调用必须向终止条件靠近。阶乘递归是理解 DFS/BFS/动态规划的基础,3级必考!

💻代码示例

1#include <iostream>
2using namespace std;
3
4// 递归求阶乘:n! = n * (n-1)!
5long long factorial(int n) {
6 if (n == 0) return 1; // 递归出口:0! = 1,必须有!
7 return n * factorial(n - 1); // 每次 n-1,向出口靠近
8}
9
10int main() {
11 int n; // 输入范围建议 ≤20,否则 long long 会溢出
12 cin >> n;
13 cout << n << "! = " << factorial(n) << endl;
14 return 0;
15}
16// 输入 5 → 输出 5! = 120
💡 关键:long long 最大能存 20! = 2432902008176640000,21! 就溢出了!考试时注意数据范围。

🧩互动小测

Q1:factorial(5) 的递归调用过程中,factorial(0) 被调用了几次?

Q2:下面哪个是正确的递归函数?

🏋️动手练一练

📝 编程练习

题目:输入 n 和 k(0 ≤ k ≤ n ≤ 20),用递归计算组合数 C(n, k) = n! / (k! × (n-k)!)。
提示:先写一个递归阶乘函数,再用公式计算组合数。注意用 long long 防溢出。
参考答案:
#include <iostream>
using namespace std;

long long factorial(int n) {
    if (n == 0) return 1;       // 递归出口
    return n * factorial(n - 1); // 递归调用
}

int main() {
    int n, k;
    cin >> n >> k;
    long long ans = factorial(n) / (factorial(k) * factorial(n - k));
    cout << "C(" << n << "," << k << ") = " << ans << endl;
    return 0;
}

要点:组合数本质就是三个阶乘的运算,递归阶乘是核心。输入 C(5,2) → 输出 10。

📝易错点提醒

学完这个知识点后点一下