• 締切済み

フィボナッチ数列のプログラム

問題で フィボナッチ数列のn番目の値を計算する関数 int fib(int n) を再帰的に定義し、この関数を利用してフィボナッチ数列の最初の10個を表示するプログラムを書けという問題があるのですが、大まかな流れは想像できるのですが、できないので困っております。  何方か教えてください。

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★アドバイス ・フィボナッチ数列の再帰関数は出来ましたね。 >0,1,1,2,3,5,8・・・と表示できるのかがわかりません。  ↑  こんなにきれいには表示できないと思います。  何も printf() を入れなくてもよいのでは。 ・ちょっと試行錯誤してみましたが意外に難しいですね。  下のサンプルで我慢して。 サンプル: #include <stdio.h> // フィボナッチ数列 int fib( int n ) {  if ( n == 0 ) return 0;  if ( n == 1 ){printf("\n1");return 1;}    n = fib(n - 1) + fib(n - 2);  printf( " + %d", n );  return n; } // メイン関数 int main( void ) {  // フィボナッチ数列  printf( "\nfib = %d\n", fib(9) );  return 0; }

回答No.4

アドバイス。 http://www2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Recursive.html Cじゃないけど,Tiny Basicのプログラムを参考にしてみたらもっとわかりやすいかも? #『使うべきではない』とか書かれているのが気になるが(^^;; 宿題なら仕方ないかなあ・・・

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★アドバイス ・フィボナッチ数列の代わりに 1 ~ n 番目までの数を加算するサンプルを載せます。  もちろん再帰的に処理する関数です。  これを参考に『フィボナッチ数列』の関数 int fib(int n) を作成して下さい。 ・それでは下にサンプルを載せておきます。 サンプル: #include <stdio.h> // 1~n 番目までを再帰処理で加算する関数 int func_sum( int n ) {  if ( n > 0 ){   printf( "%d + ", n );   return n + func_sum( n - 1 );  }  else{   printf( "%d\n", n );   return 0;  } } // メイン関数 int main( void ) {  // 1~10 までを加算  printf( "sum = %d\n", func_sum(10) );  return 0; } その他 ・動作を分かりやすくするために func_sum() 関数に printf() 関数を使っています。  実際に実行してみて動作の確認をして下さい。  表示される内容から再帰動作で 1 ~ n 番目の数の加算が分かると思います。  これを参考にして『フィボナッチ数列』の再帰関数を作ってみて下さい。 ・以上。

hiromatu4
質問者

補足

こんな感じで作ってみたんですけど、何処にprintf()を入れれば 0,1,1,2,3,5,8・・・と表示できるのかがわかりません。 よろしくお願いいたします。 #include <stdio.h> int fib(int); main() { printf("fib = %d\n", fib(10)); } int fib(int n) { if(n == 0) return 0; if(n == 1) return 1; return fib(n - 1) + fib(n - 2); }

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

> int f(0) = 0,f(1) = 1; > > f(n) = f(n - 1) + fib(n - 2); fib関数以外にf関数も登場していますね。f関数は不要です。 数列の1番目:1(固定) 2番目:1(固定) 3番目:2(1番目+2番目) 4番目:3(2番目+3番目) 5番目:5(3番目+4番目) 6番目:8(4番目+5番目) 7番目:13(5番目+6番目) 8番目:21(6番目+7番目) 9番目:34(7番目+8番目) 10番目:55(8番目+9番目) という結果を得るために、fib関数では呼び出し元に どういう値を返す必要があるか、検討してみてください。

noname#77845
noname#77845
回答No.1

自分の考えた「大まかな流れ」を補足してください。 このままでは、「丸投げ」で削除対象になってしまいます。

hiromatu4
質問者

補足

int fib(int n) { int f(0) = 0,f(1) = 1; f(n) = f(n - 1) + fib(n - 2); } こんな感じで考えているんですけど。よろしくお願いします。

関連するQ&A

  • フィボナッチ数列 プログラミング C言語

    「フィボナッチ数を次の手順で求めるプログラムfib2.cを作成。 再帰関数 int fib(int n)を定義し,再帰呼出しによりfib(n)の値を求める。n=30までのフィボナッチ数を求めて表示せよ。 またどのnの値まで求めるか?」という問題です。 で下記のように作りましたが再帰関数をつかわなかったので再提出になってしまいました。 再帰関数はどうやって使うのでしょうか。 今回の場合はどの部分が再帰関数になるのでしょうか? おねがいします。 #include<stdio.h> main() { int fib[100], i; fib[0] = 0; fib[1] = 1; printf("F0=0\nF1=1\n"); for(i=2; i<=30; i++) { fib[i] = fib[i-1]+fib[i-2]; printf("F%d=%d\n",i, fib[i]); } }

  • excel vbaのプログラムが作成できません

    プログラミングでexcel vbaを勉強しています。 excel vbaのプログラムでフィボナッチ数列のプログラムを作れという問題なんですけど、正直全くわかりません。誰かこのプログラミングを教えてください。お願いします。 フィボナッチ数列は次のように帰納的に定義される。 fib(1) = fib(2) = 1 fib(n) = fib(n - 1) + fib(n - 2) (ただしn >= 3) この関数fib(n)を定義せよ。ただし引数nはInteger型、fib関数の返す値はLong型とする。 またfib関数を呼び出す適当なメインプロシージャを定義し、A1セルからA20セルまでに fib数列の1~20番目の値を書き出すようにせよ。 という問題です。ほんとに困ってますお願いします

  • フィボナッチ数列 c言語

    c言語でフィボナッチ数列を求めるプログラムを再帰関数をつくり作れという問題でしたのように作りました。 windowsでcygwinというものを使ってコンパイルしています #include <stdio.h> int fib(int); main() { int n,i; printf(\"第何項までのフィボナッチ数? n=\"); scanf(\"%d\",&n); fib(0)=0; fib(1)=1; for(i=2;i<=n;i++){ print(\"f(%d)=%d\",n, fib(n));} } エラーは $ gcc fib2.c fib2.c: In function `main\': fib2.c:10: error: invalid lvalue in assignment fib2.c:10: error: invalid lvalue in assignment とでました。 どこかちがいますか?

  • フィボナッチ数列X(n+1)= X(n+1)+X(n) (X(1)=X

    フィボナッチ数列X(n+1)= X(n+1)+X(n) (X(1)=X(2)=1) の1項X(1)からX(30)までの値を表示するプログラムを再帰関数を使って作る方法を教えてください。 再帰関数がよくわかりません。

  • フィボナッチ数列をつくってみたけれど・・・

    ちょうど学校でフィボナッチ数列の話題になったので、思いつきで作ってみました。 そこで、配列を使ったものと再帰呼び出しを使ったものを作りました。 //再帰呼び出し unsigned long Fibonacci(int n){ if(n==1){ return 1;} //初項 else if(n==2){ return 1;} //第2項 return Fibonacci(n-1) + Fibonacci(n-2); } //配列 unsigned long Fibonacci(int n){ unsigned long long f[101]; int i; f[1] = 1; f[2] = 1; for( i=3; i<=n; i++){ f[i] = f[i-1] + f[i-2]; } return f[n]; } この二つを比較すると明らかに配列の方が早いです。 ということは再帰呼び出しはあまり使わない方がよいってことですよね? この場合は配列も似たような感じで見ることができますし。 それとも自分の再帰の書き方が悪いのでしょうか。

  • フィボナッチ数列

    Fnをn番目のフィボナッチ数として F2n=(Fn+1)^2-(Fn-1)^2 (2n番目=n+1番目の二じょうとn-1番目の二条の差) というのと リュカ数列との関係式 Fn+1 + Fn-1 =Ln+1 n+1とn-1番目のフィボナッチ数の差はn+1番目のリュカ数 の2つの式の説明お願いできますか?

  • フィボナッチ数列とルーカス数列を使った証明

    フィボナッチ数列とルーカス数列(リュカ数列)使った証明です。 L(n)をルーカス数列のn番目の数字、F(n)をフィボナッチ数列のn番目の数字として、 L(0) = 2, L(1) = 1 F(0) = 0, F(1) = 1 の場合、 L(n) = F(n-1) + F(n+1) になることを証明しようと思ってます。 ビネの公式を使って証明しようと思ったんですが、うまく行きませんでした。それに、もっと簡単な方法があると思うんですが、どなたかわかりませんか?

  • フィボナッチ数列に関する問題です

    写メにある定義でgi(n)(i=1、2、3、4)に対して、漸化式gi(n+1)=gi(n)+gi(n-1)が成り立つことを示し、各gi(n)をフィボナッチ数列f(n)を使って示せ。という問題です とても困っています。お願いします。

  • フィボナッチ数列の性質

    フィボナッチ数列の性質についてです。 ・左から数えて5番目ごとの数字は5で割り切れる。 ・(初項+第2項+第3項・・・・・+第n項) =第n項×(第n項+1) ・フィボナッチ奇数番目のフィボナッチ数をじゅんにたすと、最後の次の数になる。 ・フィボナッチ偶数番目のフィボナッチ数をじゅんにたすと、最後の次の数から1ひいたものになる。 ・フィボナッチ3つ続いたフィボナッチ数の、外2つをかけたものから中の2乗をひくと、(かわりばんこに)1か-1になる。 上のような性質があるのですが、これを数学的(記号などを使って)に表すとどのように書けますか?

  • C言語でのフィボナッチ数列の表示

    1~40番目のフィボナッチ数列を全て表示するプログラミングを作成せよ。 但し、f(1)=1、f(2)=1、f(n)=f(nー1)+f(n-2)(n≧3) と定義する。 この問題がわかりません。誰か教えてください。

専門家に質問してみよう