我用C语言编写了代码,该代码计算二项式系数并将其加到双数组中。我使用打印(printf
)系数测试了该函数,并且该函数正常工作,但是当我尝试将系数放入双数组(matrix
)时,它只是冻结了,我需要停止编译(它不会t显示任何错误)。
此代码为:
#include <stdio.h>
#include <math.h>
int binomialCoeff(int n, int k) {
int p;
// Base Cases
if (k == 0 || k == n)
return 1;
p = binomialCoeff(n - 1, k - 1) + binomialCoeff(n - 1, k);
return p;
}
/* Driver program to test above function*/
int main() {
int r = 5, l, j;
int c[100][100];
for (j = 2; j < r + 1; j++)
for (l = 0; l < r + 1; l++) {
c[j][l] = binomialCoeff(j, l);
printf(" c=%d", c[j][l]);
}
return 0;
}
关于我的代码正在发生什么的任何建议?
答案 0 :(得分:1)
这是您的函数binomialCoeff()
的错误。
n>=k
。因此,您的递归function call
变为 infinite 并导致 segmentation error 。尝试此修改后的代码,它将起作用;-
int binomialCoeff(int n, int k)
{
int p;
if(n < k) // new condition
return 0;
// Base Cases
if (k == 0 || k == n)
return 1;
p = binomialCoeff(n - 1, k - 1) + binomialCoeff(n - 1, k);
return p;
}
输出:-
c=1 c=2 c=1 c=1 c=1 c=1 c=1 c=3 c=3 c=1 c=1 c=1 c=1 c=4 c=6 c=4 c=1 c=1 c=1 c=5 c=10 c=10 c=5 c=1
答案 1 :(得分:1)
您用定义域外的参数调用binomialCoeff
函数:它不处理k > n
的情况。更严格地定义它是更安全的:
#include <stdio.h>
#include <stdlib.h>
int binomialCoeff(int n, int k) {
// Base Cases
if (n < 0 || k < 0 || k > n)
return 0;
if (k == 0 || k == n)
return 1;
return binomialCoeff(n - 1, k - 1) + binomialCoeff(n - 1, k);
}
/* Driver program to test above function*/
int main(int argc, char *argv[]) {
int r, l, j;
int c[100][100];
if (argc > 1) {
r = atoi(argv[1]);
if (r >= 100)
return 1;
} else {
r = 5;
}
for (j = 0; j <= r; j++) {
for (l = 0; l <= j; l++) {
c[j][l] = binomialCoeff(j, l);
printf(" %7.0d", c[j][l]);
}
printf("\n");
}
return 0;
}
但是请注意,对于较大的参数值,此递归方法非常慢(尝试32)。由于您存储的是二项式系数,因此应该像手动计算那样迭代地计算它们:
#include <stdio.h>
#include <stdlib.h>
/* Simpler program to compute and print the binomial coefficients */
int main(int argc, char *argv[]) {
int r, l, j;
int c[100][100];
if (argc > 1) {
r = atoi(argv[1]);
if (r >= 100)
return 1;
} else {
r = 5;
}
c[0][0] = 1;
for (j = 1; j <= r; j++) {
c[j][0] = 1;
for (l = 1; l < j; l++) {
c[j][l] = c[j - 1][l - 1] + c[j - 1][l];
}
c[j][j] = 1;
}
for (j = 0; j <= r; j++) {
for (l = 0; l <= j; l++) {
printf(" %7.0d", c[j][l]);
}
printf("\n");
}
return 0;
}
答案 2 :(得分:0)
在j=2
和l=3
时遇到问题。
计算binomialCoeff(2, 3)
需要了解binomialCoeff(1, 3)
计算binomialCoeff(1, 3)
需要了解binomialCoeff(0, 3)
计算binomialCoeff(0, 3)
需要了解binomialCoeff(-1, 3)
计算binomialCoeff(-1, 3)
需要了解binomialCoeff(-2, 3)
...
看看这将花费多长时间?尝试将其更改为for( l = 0; l < j; l++ )
以查看其是否冻结。要修复该错误,请尝试阻止binomialCoeff(0, 3)
调用binomialCoeff(-1, 3)
作为旁注...
发布此消息意味着您不使用调试器,而没有调试器进行编码意味着您将每隔两分钟发布一次stackoverflow(如您所知,编码=>错误)。如果您有调试器,则可以遵循循环,然后了解何时被binomialCoeff(-100, 3)
所吸引。使用Visual Studio或gdb(对于刚接触编程的人来说,前者要好得多)。如果您不在Windows上,则CodeBlocks也可以很好地工作。最终,您将能够查看代码并查看所需的基本情况,但是调试器会发展出这种直觉。
(继续在没有调试的情况下发布stackoverflow可能会使您陷入trouble)