C言語関係掲示板

過去ログ

No829 フィボナッチ数列の関数

[戻る] [ホームページ]
No.10466

フィボナッチ数列の関数
投稿者---田村 正和(2003/11/12 17:16:54)


フィボナッチ数列の第10項を求めるプログラムを以下のように作成したのですがエラーになってしまいました。エラーになった場所は不明です。すいません。
#include <stdio.h>

int fib1(int n)
{
  fib1(1)=1;
  fib1(2)=1;
  if(n>=3)
  {
    fib1(n)=fib1(n-1)+fib1(n-2);
    fib1(n-1)=fib1(n);
    fib1(n-2)=fib1(n-1);
    return fib1(n);
  }
}

int main(void)
{
  int x;
  x=fib1(10);
  printf("fib(10)=%d\n",x);
  return 0;
}



No.10467

Re:フィボナッチ数列の関数
投稿者---たか(2003/11/12 17:46:24)


>フィボナッチ数列の第10項を求めるプログラムを以下のように作成したのですがエラーになってしまいました。エラーになった場所は不明です。すいません。
>

関数名に値を代入する事でリターンするのはDelphiとかPascalのような
言語です。C言語ではあからさまにreturn 値と書きます。

#include <stdio.h>

int fib1(int n)
{
  if (n == 1 || n == 2) return 1;

  return fib1(n - 1) + fib1(n - 2);
}

int main(void)
{
  int x;
  x = fib1(10);
  printf("fib(10)=%d\n",x);
  return 0;
}


No.10473

Re:フィボナッチ数列の関数
投稿者---田村 正和(2003/11/13 16:29:58)


今日学校でコンパイルしてみたらfib1(1)=1,fib1(2)=1と初期化しているところが間違っていると分かりました。どう直したらいいでしょうか?
ちなみにここは第一項目、第2項目の数を1と初期化しています。初期化というか設定ですかね。


No.10475

Re:フィボナッチ数列の関数
投稿者---たか(2003/11/13 17:24:28)


>今日学校でコンパイルしてみたらfib1(1)=1,fib1(2)=1と初期化しているところが間違っていると分かりました。どう直したらいいでしょうか?
>ちなみにここは第一項目、第2項目の数を1と初期化しています。初期化というか設定ですかね。

もしかして関数と配列を取り違えていませんか?配列で書くと次のよう
になります。

#include <stdio.h>

#define NMAX 100

int fib1(int n)
{
  int fib[NMAX], i;
  
  fib[1]=1;
  fib[2]=1;
  if (n >= 3)
    for (i = 3; i < NMAX && i <= n; i++) {
      fib[i] = fib[i - 1] + fib[i - 2];
  }
  if (n >= NMAX) return -1; /* エラー */
  else return fib[n];
}

int main(void)
{
  int x;
  x=fib1(10);
  printf("fib(10)=%d\n",x);
  return 0;
}


No.10503

Re:フィボナッチ数列の関数
投稿者---ドォーンchen(2003/11/15 02:04:46)


#include <stdio.h>

#define NMAX 100

int fib1(int n)
{
  int fib[NMAX], i;
  
  fib[1]=1;
  fib[2]=1;
  if (n >= 3)
    for (i = 3; i < NMAX && i <= n; i++) {
      fib[i] = fib[i - 1] + fib[i - 2];
  }
  if (n >= NMAX) return -1; /* エラー */
  else return fib[n];
}

int main(void)
{
  int x;
  x=fib1(10);
  printf("fib(10)=%d\n",x);
  return 0;
}</


フィボナッチ数列というのを知らないのでなんとも言い辛かったんですが
この部分って意味がない気がするのは私だけでしょうか?
if (n >= 3)
if (n >= NMAX) return -1;
nって10確定ですよね?
ついでに、
fib[0]=1;
fib[1]=1;
で、
for (i = 2; i < NMAX && i <= n; i++)
fib[i] = fib[i - 1] + fib[i - 2];
なのでは?

何か意図があったのなら、ごめんなさい。
そのような計算式だったのなら、ごめんなさい。
間違っていたら、ごめんなさい。
しゃしゃり出すぎました。




No.10505

Re:フィボナッチ数列の関数
投稿者---たいちう(2003/11/15 10:13:56)


main()をこう変えても、fib1()は修正しなくても良いではないですか。

int main(void)
{
  int i, x;
  for (i=1;i<=10;i++) {
  x=fib1(i);
  printf("fib(%d)=%d\n",i,x);
  }
  return 0;
}

先見の明のあるたかさんはそこまで考えて作っているのです。
関数を作るときに少しだけ丁寧に作っておけば、後々便利な場合も多いのですが、
必要以上に丁寧に作ってしまう場合もあります。

配列の添え字はもちろん0から使えますが、0を使わないことも許されます。
n番目の数をfib[n]に入れる方が好きな人もいれば、配列は0から使わないと
気が済まない人もいます。この辺は好きずきでしょう。
私はどっちかというと後者ですが。

ちなみにFibonacci数列については、
f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) (n>=2)
という定義を使えば、両者の欲求が満たされます。




No.10518

Re:フィボナッチ数列の関数
投稿者---たか(2003/11/15 17:24:23)


>先見の明のあるたかさんはそこまで考えて作っているのです。

そこまで言われちゃうと恥ずかしいですが、「一般化」という考えに
基づいてプログラムを作っています。

実行してある一定の結果しか出さないプログラムは「ハードコーディング
された」と言います。関数は再利用しやすく作る事を心がけていますの
で、ある程度の柔軟性を持たせるのが普通です。折角コンピュータという
道具があるのですから、「汚れ仕事はコンピュータに任せて」しまいまし
ょう。

No.10520

Re:フィボナッチ数列の関数
投稿者---ドォーンchen(2003/11/15 22:22:59)


>実行してある一定の結果しか出さないプログラムは「ハードコーディング
>された」と言います。関数は再利用しやすく作る事を心がけていますの
>で、ある程度の柔軟性を持たせるのが普通です。折角コンピュータという
>道具があるのですから、「汚れ仕事はコンピュータに任せて」しまいまし
>ょう。

な、なるほど。
なっとくです。
大変勉強になりました。ありがとうございました。