在 Python 中,计算组合数(从 n 个不同元素中取 k 个元素的组合数)可以通过多种方式实现,以下是几种常见的方法:

方法 1:使用 math.comb(Python 3.8+)
Python 3.8 及以上版本提供了内置的 math.comb() 函数,直接计算组合数:
import math n = 5 k = 2 result = math.comb(n, k) print(result) # 输出: 10
优点:简洁高效,直接调用标准库。
缺点:仅适用于 Python 3.8+。
方法 2:使用 scipy.special.comb(科学计算库)
如果已安装 scipy,可以使用 scipy.special.comb:
from scipy.special import comb n = 5 k = 2 result = comb(n, k) print(result) # 输出: 10.0(返回浮点数)
优点:支持重复组合(repetition=True)等高级功能。
缺点:需要安装 scipy。

方法 3:手动实现组合公式
组合数的数学公式为: [ C(n, k) = \frac{n!}{k!(n-k)!} ] 可以用阶乘函数实现:
import math
def combination(n, k):
return math.factorial(n) // (math.factorial(k) * math.factorial(n - k))
n = 5
k = 2
result = combination(n, k)
print(result) # 输出: 10
优点:无需额外依赖,适用于所有 Python 版本。
缺点:大数计算时可能效率较低(需多次计算阶乘)。
方法 4:递归实现(动态优化)
通过递归公式 ( C(n, k) = C(n-1, k-1) + C(n-1, k) ) 实现,并加入缓存优化:
from functools import lru_cache
@lru_cache(maxsize=None)
def combination(n, k):
if k == 0 or k == n:
return 1
return combination(n - 1, k - 1) + combination(n - 1, k)
n = 5
k = 2
result = combination(n, k)
print(result) # 输出: 10
优点:避免重复计算,适合多次调用。
缺点:递归深度可能受限,大数时效率不如迭代。

方法 5:迭代实现(避免递归)
使用动态规划(DP)表格计算组合数:
def combination(n, k):
if k > n - k:
k = n - k # 利用对称性减少计算量
dp = [0] * (k + 1)
dp[0] = 1
for i in range(1, n + 1):
for j in range(min(i, k), 0, -1):
dp[j] = dp[j] + dp[j - 1]
return dp[k]
n = 5
k = 2
result = combination(n, k)
print(result) # 输出: 10
优点:高效,适合大数计算。
缺点:代码稍复杂。
| 方法 | 适用场景 | 依赖 |
|---|---|---|
math.comb |
Python 3.8+,简单高效 | 内置库 |
scipy.special.comb |
需要科学计算功能 | scipy |
| 阶乘公式 | 无依赖,小规模计算 | math |
| 递归+缓存 | 多次调用,中小规模数据 | functools.lru_cache |
| 动态规划(迭代) | 大规模数据,避免递归限制 | 无 |
推荐:
- 如果使用 Python 3.8+,直接用
math.comb。 - 需要高级功能(如重复组合)用
scipy.special.comb。 - 无依赖场景用阶乘公式或动态规划。
