Ниже мой код. Я попытался напечатать рекурсивную функцию Фибоначчи [в самом конце], но это дало мне ошибку сегмента. Что не так с моим кодом? Я потратил около 3 часов на это и не мог понять. Может кто-то, пожалуйста, будь добр, чтобы помочь мне? благодаря
int fibonacci (int x) {
if (x == 0) {
return 0;
}
else if (x == 1) {
return 1;
}
else {
return (fibonacci(x-1) + fibonacci (x + 2));
}
}
Скорее всего, вы получаете segfault, потому что ваш стек растет без контроля и что из-за этой строки:
return (fibonacci(x-1) + fibonacci (x + 2));
вызов fibonacci() со значением, большим, чем оригинал, приводит к тому, что нерекурсивный случай никогда не будет достигнут, в результате чего стек будет в конечном итоге переполняться или пытается сделать это, так как SO обнаружит это и завершит ваш процесс.
Итак, перепишите эту строку следующим образом:
return (fibonacci(x-1) + fibonacci (x - 2));
В настоящее время рекурсия никогда не заканчивается, потому что:
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 + .......
Как вы можете видеть, это никогда не заканчивается.