Ошибка сегментации в C рекурсивной комбинации (nCr) - PullRequest
0 голосов
/ 17 апреля 2010

Пожалуйста, помогите мне здесь. Программа должна рекурсивно выяснить комбинацию двух чисел. 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 ]

4 голосов
/ 17 апреля 2010

Поскольку nCr не имеет никакого оператора return, который не является рекурсивным, он будет повторяться бесконечно. Так как это приведет к бесконечному росту стека, вы получите ошибку сегментации.

Обычно рекурсивная функция должна всегда иметь хотя бы один возможный путь через функцию, которая не рекурсивна. В противном случае у вас бесконечная рекурсия.

3 голосов
/ 17 апреля 2010
  1. Почему вы используете поплавки? Комбинации имеют дело только с целыми числами ... Используйте формулу , которая не включает арифметику с плавающей запятой.
  2. Независимо от того, что происходит, выполняется рекурсивный вызов. Это означает, что у вас будет бесконечная рекурсия. Вот почему происходит ошибка сегментации. Я предлагаю вам прочитать ссылку, которую я вам дал, и реализовать свою программу, используя одну из приведенных здесь формул. Обратите внимание на базовые случаи.
1 голос
/ 17 апреля 2010

Вы наверняка впадаете в бесконечную рекурсию, чтобы получить эту Ошибка сегментации. По сути, у вас нет базового сценария, чтобы остановить рекурсию, как упоминал sepp2k.

0 голосов
/ 17 апреля 2010

Вы пытались отладить сбой?Вы можете использовать эту страницу в качестве ссылки.Если вы можете опубликовать информацию о сбое (отслеживание стека и т. Д.), Это поможет вам и сообществу SO разобраться в проблеме.

...