方法一:
C(n,r) = n!/(n-r)!r!
方法二:
在书籍 《组合算法》(Combinatorial Algorithms) 作者Wilf 中,我发现了这个:
C(n,r)可以写成C(n-1,r) + C(n-1,r-1)
。
例如:
C(7,4) = C(6,4) + C(6,3)
= C(5,4) + C(5,3) + C(5,3) + C(5,2)
. .
. .
. .
. .
After solving
= C(4,4) + C(4,1) + 3*C(3,3) + 3*C(3,1) + 6*C(2,1) + 6*C(2,2)
正如您所看到的,最终解决方案不需要进行任何乘法计算。在每个C(n,r)形式中,要么n等于r,要么r等于1。
这是我实现的示例代码:
int foo(int n,int r)
{
if(n==r) return 1;
if(r==1) return n;
return foo(n-1,r) + foo(n-1,r-1);
}
请参见这里的输出。
在第二种方法中,存在重叠子问题,我们需要递归调用来再次解决相同的子问题。我们可以使用动态规划来避免这个问题。
我想知道计算C(n,r)的更好方法是什么?