如果 n 离 r 不远,那么使用组合的递归定义可能会更好,因为 xC0 == 1 你只会有几次迭代:
这里相关的递归定义是:
nCr = (n-1)C(r-1) * n/r
这可以使用尾递归和以下列表很好地计算:
[(n - r, 0), (n - r + 1, 1), (n - r + 2, 2), ..., (n - 1, r - 1), (n, r)]
这当然很容易在 Python 中生成(我们省略了第一个条目,因为 nC0 = 1)izip(xrange(n - r + 1, n+1), xrange(1, r+1))
请注意,这假设 r
现在我们只需要使用带有reduce 的尾递归来应用递归步骤。我们从 1 开始,因为 nC0 是 1,然后将当前值与列表中的下一个条目相乘,如下所示。
from itertools import izip
reduce(lambda x, y: x * y[0] / y[1], izip(xrange(n - r + 1, n+1), xrange(1, r+1)), 1)