C ++ Рекурсивная функция Фебоначи

0

Ниже мой код. Я попытался напечатать рекурсивную функцию Фибоначчи [в самом конце], но это дало мне ошибку сегмента. Что не так с моим кодом? Я потратил около 3 часов на это и не мог понять. Может кто-то, пожалуйста, будь добр, чтобы помочь мне? благодаря

int fibonacci (int x) {


    if (x == 0) {
        return 0;
    }
    else if (x == 1) {
        return 1;
    }
    else {
    return (fibonacci(x-1) + fibonacci (x + 2));
    }
}
  • 1
    Где (иначе какая строка) вы получаете ошибку сегмента?
  • 0
    именно там, где функция Фибоначчи должна печатать.
Теги:
function
recursion
fibonacci
segment

2 ответа

4

Скорее всего, вы получаете segfault, потому что ваш стек растет без контроля и что из-за этой строки:

    return (fibonacci(x-1) + fibonacci (x + 2));

вызов fibonacci() со значением, большим, чем оригинал, приводит к тому, что нерекурсивный случай никогда не будет достигнут, в результате чего стек будет в конечном итоге переполняться или пытается сделать это, так как SO обнаружит это и завершит ваш процесс.

Итак, перепишите эту строку следующим образом:

    return (fibonacci(x-1) + fibonacci (x - 2));
  • 1
    Я только заметил это, а затем вы опубликовали ответ :)
  • 0
    спасибо большое ребята
1

В настоящее время рекурсия никогда не заканчивается, потому что:

return (fibonacci(x-1) + fibonacci (x + 2));

должно быть

return (fibonacci(x-1) + fibonacci (x - 2));

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

fibonnaci(2) = fibonacci(1)+fibonacci(4)
             = 1 + (fibonacci(3)+fibonacci(6))
             = 1 + (((fibonacci(2)+fibonacci(5))+(fibonacci(5)+fibonacci(8)))
             = 1 + .......

Как вы можете видеть, это никогда не заканчивается.

  • 0
    ошибка копирования-вставки? Ваша коррекция по-прежнему имеет х + 2 (Изменить - вот и все)
  • 0
    Да, ошибка копирования и вставки :) теперь должна быть исправлена

Ещё вопросы

Сообщество Overcoder
Наверх
Меню