プロが教える店舗&オフィスのセキュリティ対策術

以下の数列について,初項から第15項までを求めるプログラムと実行結果を示せ。
0 1 1 2 3 5 8 13 21(ただし,初項=0,第1項=1とする。)

ソースコードを書くと、エラーがでた。
#include <stdio.h>
int fib(int n)
{
if(n==1 || n==2)
return 1;
else
return fib(n-1)+fib(n-2);
}
int main(void)
{
int n;
for(n=0;n<17;n++)
printf("%d,",fib(n));
}

正しソースコードを教えてください!

よろしくお願いします。

A 回答 (5件)

#include <stdio.h>



void fib(int i, int j, int n)
{
if (n == 1)
{
printf("%d\n", i);
}
else
{
printf("%d\n", i);
return fib(j, i + j, n - 1);
}
}

int main(void)
{
fib(0, 1, 15);

return 0;
}
    • good
    • 0
この回答へのお礼

ありがとうございます!!

お礼日時:2009/04/26 02:23

なんか日本語に指摘が入っていますがw


フィボナッチ数列でしょうか?ならばそうと最初から書けば・・・。

ループを追い掛けていきましょう。
ループで走らせる関数の中で、想定していない数字があるはずです。
    • good
    • 0

>ソースコードを書くと、エラーがでた。



ソースコードを書いただけでエラーが出たのですか?
コンパイルはしてみなかったのですか?
    • good
    • 0

関数 fibの引数が 0の場合どこが実行されるのかを考えてみましょう



// n ==0 なので ここは条件が成り立たない
if(n==1 || n==2)
  return 1;
else
  // ここにくるので 再帰呼出される
  // fib(-1) + fib(-2)
  return fib(n-1)+fib(n-2);
といった具合になります

fib(-1) や fib(-2) も if(n==1||n==2) の条件に合致しないので
再帰になりfib(-2) や fib(-3)、fib(-3)、fib(-4)を計算しようとします
これを永遠に繰り返して最後にはスタックを食いつぶして止まるか
暴走状態に陥って パソコンなどの再起動となるかもしれません
    • good
    • 0

正しいソースコード以前に、


問題の答えが出ていません。

つまり答えになっていない、です。

正しいソースコードとは、
正しい答え&正しいコーディングです。

少なくとも答えは出しましょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!