Проблема с опубликованным кодом заключается в том, что если мы оцениваем 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);
}
}
person
shuttle87
schedule
08.09.2010