Проблема с опубликованным кодом заключается в том, что если мы оцениваем foo (1), нам нужно найти foo (0) и foo (-1), тогда foo (-1) нужно найти foo (-2) и foo (-3) и тд.Это будет вызывать больше вызовов функции foo () до тех пор, пока в памяти не останется свободного места, что приведет к переполнению стека.Количество вызовов foo будет зависеть от размера стека вызовов, который будет зависеть от конкретной реализации.
Когда я вижу эти строки кода, у меня сразу создается впечатление, что тот, кто написал его, не задумывался овсе возможные входы, которые могут быть переданы в функцию.
Чтобы создать рекурсивную функцию Фибоначчи, которая не сбоит для foo (1) или отрицательного входа, мы получим:
foo (int n) {
if( n < 0 ) return 0;
if (n == 0) return 1;
return foo(n-1) + foo(n-2);
}
Редактировать: возможно, возвращение отрицательного числа должно быть чем-то другим, так как последовательность Фибоначчи неявно не определена для отрицательных индексов.
Однако, если мы используем расширение, то fib (-n) = (-1)^ (n + 1) fib (n) мы могли бы получить следующий код:
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);
}
}