Проблема с отправленным кодом заключается в том, что если мы оценим foo (1), нам нужно найти foo (0) и foo (-1), foo (-1), тогда необходимо найти foo (-2) и foo (-3) и т. Д. Это позволит помещать больше вызовов в foo(), пока в памяти больше нет места, что приведет к переполнению стека. Количество звонков в foo будет зависеть от размера стека вызовов, который будет специфичным для реализации.
Когда я вижу эти строки кода, я сразу создаю впечатление, что тот, кто его написал, не думал обо всех возможных входах, которые могли бы быть переданы функции.
Чтобы сделать рекурсивную функцию Фибоначчи, которая не подведет для обув (1) или отрицательный вход мы получаем:
foo (int n) {
if(n < 0) return 0;
if (n == 0) return 1;
return foo(n-1) + foo(n-2);
}
Edit: возможно возвращение на отрицательное число должно быть что-то еще, как последовательность фибоначчи не определена неявно для отрицательных индексов.
Однако, если мы будем использовать расширение, которое FIB (-n) = (-1)^(п + 1) выдумку (п) мы могли бы получить следующий код:
int fib(int n) {
if(n == -1){
return 1;
}else if (n < 0){
return ((-1)^(-n+1) * fib(-n));
}else if (n == 0){
return 1;
}else{
return fib(n-1) + fib(n-2);
}
}
В чем вопрос? Требуется ли отладка кода? – Nivas
«Что ожидалось в качестве ответа?» Как мы можем сказать? –
@ Vinko вопрос наверху. – zengr