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

时间:2010-04-17 16:22:50

标签: 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%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);
}

4 个答案:

答案 0 :(得分:4)

由于nCr没有任何非递归的return语句,因此它将无限递归。由于这会导致堆栈无限增长,因此会出现分段错误。

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

答案 1 :(得分:3)

  1. 你为什么使用花车?组合只处理整数...使用不涉及浮点运算的a formula
  2. 无论发生什么,都会进行递归调用。这意味着您将获得无限递归。这就是分段故障发生的原因。我建议你阅读我给你的链接,并使用其中的一个公式实现你的程序。注意基本情况。

答案 2 :(得分:1)

你肯定会陷入无限递归以获得此分段错误。你本质上没有基本情况来停止递归,如sepp2k所述。

答案 3 :(得分:0)

您是否尝试过调试崩溃?您可以使用this page作为参考。如果您可以发布有关崩溃的信息(堆栈跟踪等),这将有助于您和SO社区解决问题。