为什么下面的代码是错误的?二项式系数
本文关键字:二项式 错误 代码 为什么 | 更新日期: 2023-09-27 18:14:56
我正在做项目euler,我现在在问题15,这里是一个链接:https://projecteuler.net/problem=15。我试着用二项式系数来解它。这里有一个网站可以解释:http://www.mathblog.dk/project-euler-15/。你可以在底部找到它。
我的问题是,为什么下面的代码是错误的?由于这遵循数学算法,我认为:n-k+ I/I
int grid = 20;
long paths = 1;
for (int i = 0; i < grid; i++)
{
paths *= (grid * 2) - (grid + i)
paths /= (i + 1);
}
Console.WriteLine(paths);
Console.ReadKey();
为什么这个代码是错误的?这与mathblog网站完全相同,只是在1行。
int grid = 20;
long paths = 1;
for (int i = 0; i < grid; i++)
{
paths *= ((grid * 2) - i) / (i + 1);
}
Console.WriteLine(paths);
Console.ReadKey();
但是为什么这段代码是正确的呢?和前面的代码不一样吗?它并不完全遵循数学算法,不是吗?因为它是n-k+i/i,这段代码是n-i/i
int grid = 20;
long paths = 1;
for (int i = 0; i < grid; i++)
{
paths *= ((grid * 2) - i);
paths /= (i + 1);
}
Console.WriteLine(paths);
Console.ReadKey();
感谢的人!
如果你想合并计算,它应该像这样
paths = (path *((grid * 2) - i))/(i + 1);
按照惯例,在许多编程语言中,int/int给出int,*不是浮点数。你的方法暗示'paths'应该接受非int型的值。事实上,这三种方法都不应该起作用,但幸运的是,最后一种方法起作用了:基本上是因为"路径"的所有中间值恰好也是二项式系数。
调试建议:让你的程序输出中间值。这很有帮助。
*:作为一名数学家,我几乎从不需要这个特性。实际上,另一种约定(int/int -> double)通常会使我的程序员生活更轻松。
我看了一下你提到的博客。这让你的信息更容易被理解。博客提到了一个公式:i从1到k的乘积(n-k+1)/i。所以要模仿它,你需要写
for (int i = 1; i <= grid; i++) // bounds!
{
paths *= (grid * 2) - (grid - i) // minus sign!
paths /= (i + 1);
}
关于这对int型有效的事实:这是一个意外,因为在乘积的中间值(在每个循环结束时)在整个计算过程中都是二项式系数。如果您以另一种顺序计算乘积和除数,那么您很可能得到非整数,因此由于惯例int/int -> int,对于path的整数变量类型计算将失败。博客没有提到这一点是没有多大帮助的。