Codechef/SPOJ:&x27;大理石';运行时错误
我在spoj上试过弹珠问题-(链接:) 但是,在多次尝试之后,我得到了运行时错误(SIGSEGV) 这是我提交的代码-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
#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
有时可以用来增加堆栈的大小,但对于非常大的数字来说,它仍然不是一个解决方案。只需寻找一个非递归的解决方案,例如,等等。