投稿されたコードの問題は、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);
}
}