Рекурсия C , вызывающая segfault?

#c #recursion #segmentation-fault #runtime-error

Вопрос:

Сегодня я попросил своего ученика написать этот код, и он сегментируется, и я не совсем понимаю, почему. Проблема заключается в подсчете букв для английского произнесения чисел. Это одна из самых ранних проблем проекта Эйлера. Есть ли проблема с рекурсией или что-то в этом роде?

 #include<iostream>
using namespace std;

int dlugosc(int x)
{
    if(x == 1) return 3;
    if(x == 2) return 3;
    if(x == 3) return 5;
    if(x == 4) return 4;
    if(x == 5) return 4;
    if(x == 6) return 3;
    if(x == 7) return 5;
    if(x == 8) return 5;
    if(x == 9) return 4;
    if(x == 10) return 3;
    if(x == 11) return 6;
    if(x == 12) return 6;
    if(x == 13) return 7;
    if(x == 14) return 8;
    if(x == 15) return 7;
    if(x == 16) return 7;
    if(x == 17) return 9;
    if(x == 18) return 8;
    if(x == 19) return 8;
    if(x == 20) return 6;
    if(x == 21) return 10;
    if(x == 22) return 10;
    if(x == 30) return 6;
    if(x == 40) return 6;
    if(x == 50) return 5;
    if(x == 60) return 5;
    if(x == 70) return 7;
    if(x == 80) return 6;
    if(x == 90) return 6;
    if(x == 100) return 11;
    if(x == 200) return 11;
    if(x == 300) return 13;
    if(x == 400) return 12;
    if(x == 500) return 12;
    if(x == 600) return 11;
    if(x == 700) return 13;
    if(x == 800) return 13;
    if(x == 900) return 12;
    if(x < 100) return dlugosc(x-x)   dlugosc(x);
    if(x < 1000) return dlugosc(x-x0)   dlugosc(x-x)   dlugosc(x)   3;
    if(x == 1000) return 11;
}

int main()
{
    int ile = 0;
    for(int i=1; i<=1000; i  )
    {
        ile  = dlugosc(i);
    }   
    cout << ile;
    return 0;
}
 

Комментарии:

1. Вы пробовали пройти через это с помощью отладчика?

2. Что будет dlugosc(110) делать?

3. По общему признанию, я не знаю, как использовать отладчики в C . Я родом из C#.

Ответ №1:

Рекурсия не завершается для ввода x=110 . Вы можете быстро проверить это с помощью gdb или вручную:

 if(x < 1000) return dlugosc(x-x0)   dlugosc(x-x)   dlugosc(x)   3;
 

Так x - x как есть x , если x делится на 10 , второй член ( dlugosc(x-x) ) будет рекурсироваться бесконечно для x = 110 .

Комментарии:

1. @СкоттХантер, А? За что? Я что-то пропустил?

2. Проверьте комментарии.

3. @ScottHunter Ах. Не заметил их, я просто бросил программу в отладчик.

4. Меня позабавило, что, хотя любое число от 100 до 999, делящееся на 10, но не на 100, будет работать, мы оба выбрали одно и то же.

5. @ScottHunter это первое, что приводит к ошибке сегментации, учитывая последовательность main . Я более или менее просто выбрал тот, который gdb бросил в меня, а затем посмотрел на код. 😀