核心答案:阶乘 n! = n×(n−1)×(n−2)×…×2×1。5! = 5×4×3×2×1 = 120。规定 0! = 1。阶乘增长速度超过指数函数:10! = 362.88 万,13! 就超过 32 位整数上限。
阶乘的定义
n! = n × (n−1) × (n−2) × … × 2 × 1
递推式:n! = n × (n−1)!——编程实现的核心:
- 递归:f(n) = n × f(n−1),f(0) = 1
- 循环:result = 1; for i in 1..n: result *= i
实例:6! = 6×5! = 6×120 = 720。
常用阶乘表
| n | n! | n | n! |
|---|---|---|---|
| 0 | 1 | 7 | 5040 |
| 1 | 1 | 8 | 40320 |
| 2 | 2 | 9 | 362880 |
| 3 | 6 | 10 | 3628800 |
| 4 | 24 | 15 | 1.31 万亿 |
| 5 | 120 | 20 | 2.43×10¹⁸ |
| 6 | 720 | 25 | 1.55×10²⁵ |
工程警示:13! = 62 亿 > 2³²(int 溢出);21! > 2⁶⁴(long 溢出)。再大需用大数库或斯特林近似。
为什么 0! = 1
三个角度理解:
- 递推反推:1! = 1×0!,所以 0! = 1!÷1 = 1
- 组合意义:从 0 个元素选 0 个的选法 C(0,0) = 0!÷(0!×0!) = 1,必须 0! = 1 才自洽
- 排列意义:空集合的排列方式只有一种——「什么都不排」
增长速度有多快
| 函数 | n=10 | n=20 |
|---|---|---|
| n² | 100 | 400 |
| 2ⁿ | 1024 | 104 万 |
| n! | 362 万 | 2.4×10¹⁸ |
阶乘完胜。斯特林近似(大 n 估算):n! ≈ √(2πn) × (n/e)ⁿ
- 100! ≈ 9.33×10¹⁵⁷,宇宙原子总数约 10⁸⁰——52 张扑克牌的排列数 52! ≈ 8×10⁶⁷,洗牌一次基本就是人类史上从未出现过的牌序。
排列组合应用
- 排列(有序):A(n,m) = n!÷(n−m)!
- 5 人选 3 人排队:A(5,3) = 5!÷2! = 60 种
- 组合(无序):C(n,m) = n!÷[m!×(n−m)!]
- 5 人选 3 人组队:C(5,3) = 120÷(6×2) = 10 种
- 全排列:n 个不同元素排队 = n! 种(5 人合影站位 120 种)
常见误区
- 「0! = 0」:错,0! = 1。与「任何数乘 0 得 0」直觉相反,但组合自洽性要求如此
- 负数阶乘:负整数无阶乘定义(伽马函数可扩展到非整数,Γ(n+1) = n!)
- (2n)! = 2×n!:错。(2n)! = 2n×(2n−1)×…×1,远大于 2×n!;6! = 720 ≠ 2×3! = 12
- 暴力算大阶乘:n>20 就该用斯特林近似或对数化,直接乘必然溢出