而不是使用默认的组合公式n! /(k!x(n – k)!),使用组合函数的递归属性.
(n, k) = (n - 1, k) + (n - 1, k - 1)
知道:(n,0)= 1和(n,n)= 1.
– >它会让你避免使用阶乘和溢出你的长期.
以下是您可以执行的实施示例:
static long Combinatory(long n, long k)
{
if (k == 0 || n == k )
return 1;
return Combinatory(n - 1, k) + Combinatory(n - 1, k - 1);
}
编辑:使用更快的迭代算法
static long Combinatory(long n, long k)
{
if (n - k < k)
k = n - k;
long res = 1;
for (int i = 1; i <= k; ++i)
{
res = (res * (n - i + 1)) / i;
}
return res;
}