Codechef/SPOJ:&x27;大理石';运行时错误

Codechef/SPOJ:&x27;大理石';运行时错误,c,C,我在spoj上试过弹珠问题-(链接:) 但是,在多次尝试之后,我得到了运行时错误(SIGSEGV) 这是我提交的代码- #include <stdio.h> int comb(long int n, long int k) { if (n==k || k==0) return 1; else return (comb(n-1, k) + comb(n-1, k-1)); } int main() { int t; long int n, k; scanf("%d

我在spoj上试过弹珠问题-(链接:)

但是,在多次尝试之后,我得到了运行时错误(SIGSEGV)

这是我提交的代码-

#include <stdio.h>
int comb(long int n, long int k)
{

if (n==k || k==0)
    return 1;
else
    return (comb(n-1, k) + comb(n-1, k-1));
}

int main() {

int t;
long int n, k;
scanf("%d", &t);
while(t--)

{
    scanf("%ld %ld", &n, &k);
    printf("%d\n", comb(n-1, k-1));

}

return 0;
}
#包括
整型梳(长整型n,长整型k)
{
如果(n==k | | k==0)
返回1;
其他的
返回(梳(n-1,k)+梳(n-1,k-1));
}
int main(){
int t;
长整数n,k;
scanf(“%d”、&t);
而(t--)
{
scanf(“%ld%ld”,&n,&k);
printf(“%d\n”,梳(n-1,k-1));
}
返回0;
}

我不明白为什么我会出错。互联网上的其他解决方案都使用迭代方法来计算nCr组合。我尝试过使用递归方法。任何帮助都将不胜感激

您在递归中递减
n
,但是当
n
变为0或负值时,您没有检查大小写,因此segfaul基本上告诉您进入无限递归

除了
n==k | | k==0
之外,只需添加一些停止条件

我没有看问题描述,所以我不知道正确的条件是什么,但也许你需要类似的东西

if (n==k || k==0 || n==0)

我照你说的做了,这似乎是对的。但我仍然得到相同的运行时错误。问题基本上是计算nCr(PnC),其中n和r非常大。因此,我在递归函数中使用了标识nCr=(n-1)Cr+(n-1)C(r-1),而不是显式计算阶乘。在大多数默认设置中,递归函数调用的数量有限,因为它们都需要堆栈上的空间。在linux上,
ulimit-s
有时可以用来增加堆栈的大小,但对于非常大的数字来说,它仍然不是一个解决方案。只需寻找一个非递归的解决方案,例如,等等。