二项式系数的C代码

时间:2018-08-02 20:38:52

标签: c

我用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;
}

关于我的代码正在发生什么的任何建议?

3 个答案:

答案 0 :(得分:1)

这是您的函数binomialCoeff()的错误。

  1. 您的函数不检查条件二项式系数中的条件n应该为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=2l=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