我使用两种方法来计算二项式系数。 一个是
SELECT
另一个是:
int fac(int n) {
if ( n < 2 ) return 1; // return 1 when n=0,1
int ret = 1;
for(int i=2; i <= n; ++i)
ret *= i; // calculate factorial
return ret;
}
int choose_fac(int n, int k) {
return fac(n)/fac(k)/fac(n-k);
}
所以当我运行(15,5)时,第二个给出正确答案,而第一个给出4.我知道对于choose_fac,当计算15时,int超出范围!但是如果这是原因,为什么choose_dp没有返回错误的答案,因为他们都使用int来定义函数?
非常感谢!
电子。
答案 0 :(得分:3)
第一个溢出int
。
当您致电fac(15)
计算choose_fac(15, 5)
应该由该函数计算的值时,1,307,674,368,000
大大超出int
的范围。计算15 choose 5
的最终结果将在int
的范围内,因为两个相对较大的因子被划分,但中间结果中的错误会阻止此计算成功完成。
使用动态编程的第二个函数没有这个问题,因为它没有明确地计算阶乘。这种计算二项式系数的方法称为Pascal's Triangle。
答案 1 :(得分:1)
当你返回fac(n)/ fac(k)/ fac(n-k)时;它从左到右进行评估。 ((fac(n))/ fac(k))/ fac(n-k))第一评估fac(n)给出溢出错误。