核心答案:阶乘 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

常用阶乘表

nn!nn!
0175040
11840320
229362880
36103628800
424151.31 万亿
5120202.43×10¹⁸
6720251.55×10²⁵

工程警示:13! = 62 亿 > 2³²(int 溢出);21! > 2⁶⁴(long 溢出)。再大需用大数库或斯特林近似。

为什么 0! = 1

三个角度理解:

  1. 递推反推:1! = 1×0!,所以 0! = 1!÷1 = 1
  2. 组合意义:从 0 个元素选 0 个的选法 C(0,0) = 0!÷(0!×0!) = 1,必须 0! = 1 才自洽
  3. 排列意义:空集合的排列方式只有一种——「什么都不排」

增长速度有多快

函数n=10n=20
100400
2ⁿ1024104 万
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 就该用斯特林近似或对数化,直接乘必然溢出