C递归组合(nCr)中的分段错误

C递归组合(nCr)中的分段错误,c,recursion,segmentation-fault,C,Recursion,Segmentation Fault,请帮帮我。程序应该递归地找出两个数字的组合。nCr=n!/(r!(n-r)!)。我在GCC上编译时收到了这个错误消息 以下是终端显示的内容: 输入两个数字: 8. 4. 分段故障 (程序退出,代码:139) 代码如下所示: #include<stdio.h> float nCr(float, float, float); int main() { float a, b, c; printf("Enter two numbers: \n"); scanf("%f%

请帮帮我。程序应该递归地找出两个数字的组合。nCr=n!/(r!(n-r)!)。我在GCC上编译时收到了这个错误消息

以下是终端显示的内容: 输入两个数字: 8. 4. 分段故障


(程序退出,代码:139)

代码如下所示:

    #include<stdio.h>

float nCr(float, float, float);

int main()
{

 float a, b, c;
 printf("Enter two numbers: \n");
 scanf("%f%f", &a, &b);
 c = nCr(a, b, a-b);
 printf("\n%.3f", c);
 return 0;
}

float nCr(float n, float r, float p)
{

        if(n<1)
 return (1/(p*r))*(nCr(1, r-1, p-1));

 if(r<1)
 return (n/(p*1))*(nCr(n-1, 1, p-1));

 if(p<1)
 return (n/r)*(nCr(n-1, r-1, 1));

 return ( n/(p*r) )*nCr(n-1, r-1, p-1);
}
#包括
浮动nCr(浮动,浮动,浮动);
int main()
{
浮子a、b、c;
printf(“输入两个数字:\n”);
scanf(“%f%f”、&a和&b);
c=不合格报告(a、b、a-b);
printf(“\n%.3f”,c);
返回0;
}
浮点数nCr(浮点数n、浮点数r、浮点数p)
{

如果(n您试过调试崩溃吗?您可以用作参考。如果您可以发布有关崩溃的信息(堆栈跟踪等)这将有助于您自己和SO社区解决问题。

因为nCr没有任何非递归的返回语句,它将无限递归。因为这将导致堆栈无限增长,所以您会遇到分段错误


基本上,递归函数应该至少有一条可能的路径通过不递归的函数。否则,你会有无限递归。

你肯定会陷入无限递归中,从而导致这个分段错误。你基本上没有sepp2k提到的停止递归的基本情况

  • 为什么使用浮点数?组合只处理整数…使用不涉及浮点运算的整数
  • 无论发生什么情况,都会进行递归调用。这意味着您将有无限递归。这就是分段错误发生的原因。我建议您阅读我提供的链接,并使用其中一个公式实现您的程序。注意基本情况

  • 使用帕斯卡三角形更好更容易。为什么要使用浮点呢?int就足够了:)我试图为nCr编写一个递归函数。在这个特殊情况下,int对于除法精度来说不够好。考虑到1!=1,这将是您的非递归路径。我将把阶乘计算移到另一个函数,并使其成为代码中唯一具有递归的部分。谢谢您的建议。@sepp2k:so我给出的基本情况是if(n==1&&r==1&&p==1)返回1;但是我仍然得到一个分段错误。错误代码139。@peachykeen:是的,我在另一个程序中做过。试图为nCr生成一个函数。谢谢,维基百科清除了一些东西。使用“替代的,几乎相等的”计算,我重写了这个函数。得到了数字不正确的结果,正在处理它。我nt comb(int n,int k){if(k==1)返回n;返回(n/k)*comb(n-1,k-1);}你正在用
    n
    除以
    k
    ,你不应该这样做,因为你要么在做整数除法,要么在做浮点运算,两者都会导致错误的结果。使用公式
    comb(n,k)=comb comb n-1,k-1)+comb(n-1,k)对于0
    。浮点运算是否正确,答案是否正确-使用wikipedia中的值以及其他值。同样感谢。仅仅因为你得到了正确的结果并不意味着你的结果总是正确的。在处理组合时,没有理由使用浮点,我强烈反对建议你不要这样做,因为这会引起问题。