• ベストアンサー

フィボナッチ数列 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 とでました。 どこかちがいますか?

noname#74733
noname#74733

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

再帰関数を作れという問題で関数のプロトタイプが int fib(int); と宣言されています。 問題の意味はこの関数の中身を再帰関数として作りなさいという意味です。 int fib( int n ) { //ここに処理を書く 自分自身(fib( )関数)を呼び出すこと }

その他の回答 (2)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

>下のように作りかえたのですがf0とf1のときの定義ができなくてうまくいきません。どのようにすればいいですか? >if(n == 1)return(1); >if(n == 2) return (1); 1と2の時の処理が入ってるのに、0と1の時の処理が判らないって? 他人が書いたソースをカンニングして流用してくるから「うまくいかない」のですよ。自分で考えてないのが「出来ない理由」です。 因みに「returnしちゃったら、あとの事は考えなくて良い」ので、elseを書く必要はありませんよ。なので fib(int n){ if(n == 0) return(0); //n==0でreturnしたら、続きは処理しない、つ~か、出来ない if(n == 1) return(1); //n==1でreturnしたら、続きは処理しない、つ~か、出来ない return fib(n-1) + fib(n-2); } でOKです。

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

>int fib(int); fib関数の定義はどこにありますか? >fib2.c:10: error: invalid lvalue in assignment >fib(0)=0; fib(1)=1; 関数呼び出しの結果を左辺に持ってくることはできない、というエラーです。

noname#74733
質問者

補足

下のように作りかえたのですがf0とf1のときの定義ができなくてうまくいきません。どのようにすればいいですか? コンパイルはできました。 #include<stdio.h> fib(int n){ if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("第何項までのフィボナッチ数?(nは正の整数) n="); scanf("%d",&n); for(i=2; i<=n; i++) { printf("F%d = %d\n",n, fib(n)); } }

関連する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]); } }

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語の課題で分からないところがあり、質問しに来ました。 ユーザから数を受けて、そこまでのフィボナッチ数列を表示させるというプログラムです。 下のソースコード(でいいんですよね?)は正しいやつです。 for文を使って、繰り返しの作業を行うことに成功しましたが、doとwhileに書き換える作業がうまくできません。 どなたか助けてください。 #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT the number. : "); scanf("%d",&n); for(i=1; i<=n; i++){ printf("F%d = %d\n",i, fib(i)); } }

  • C言語で分からない点があるのですが……

    C言語で分からない点があるのですが…… こんにちは。C言語を学んでいて、詰まったので宜しければ回答いただけると嬉しいです。 フィボナッチ数列に関するプログラミングです。 ユーザから数字を受け取ります。(第何項か) そこまでの数字を表示するというプログラムです。 n=3なら F1=1 F2=1 F3=2 という具合です。 しかし、実行した結果が添付した図の通りで、途中の項がすっ飛ばされていました。 どうすればいいんでしたっけ? 宜しければご助力ください!! #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT number.: "); scanf("%d",&n); for(i=2; i<=n; i++){ printf("F%d = %d\n",n, fib(n)); } }

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

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

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

    ちょうど学校でフィボナッチ数列の話題になったので、思いつきで作ってみました。 そこで、配列を使ったものと再帰呼び出しを使ったものを作りました。 //再帰呼び出し 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]; } この二つを比較すると明らかに配列の方が早いです。 ということは再帰呼び出しはあまり使わない方がよいってことですよね? この場合は配列も似たような感じで見ることができますし。 それとも自分の再帰の書き方が悪いのでしょうか。

  • 【C言語】フィボナッチの配列について

    フィボナッチの配列を表示するプログラムについてご質問でございます。 F[i]の計算というプログラムでございます。但し、F1=F2=1,n>2のとき、Fn-1+Fn-2=Fnでございます。 #include<stdio.h> #define N 10 int main() { int i,F[N+1]; / F[i]の計算 / for(i=1;i<=N;i++){ printf("%d\n", F[i]); } } この内、「/ F[i] の計算 /」の部分が分からず、困っております。 教えて頂けたら幸いです。

  • C言語 再帰呼びだし

    C言語 再帰呼びだし 問題が解けません。もしよろしければご指導お願いします。 フィボナッチ数を求めるプログラミングを作成せよ。 非負の整数nに対するフィボナッチ数Fnは以下のように再帰的に定義される。 Fn=0 (n=0の時) Fn=1 (n=1の時) Fn=F(n-1)+F(n-2) (n>1の時) ・関数int fibo(int n)を作成し、関数mainで、複数のnに対して関数fiboを呼びだし、その結果を表示せよ。 ・関数fiboは、再帰的にfiboを呼びだすようにせよ。 よろしくお願いします。

  • フィボナッチ数列

    C言語の問題です。 フィボナッチ数列について。 以下のプログラムはある整数を入力し、その整数以下のもっとも大きなフィボナッチ数列に含まれる整数を返すものである。 #include <stdio.h> int main(void){ int limit,new=1,pre=0,work result; scanf("%d", &limit); while(new<=limit){ /*printf("%d %d\n,pre,new);トレース用*/ work=new; new=work+pre; pre=work; } result =pre; printf("%d\n", result); } 以下を参考に、このプログラムの一部を関数にして書き換えなさい。 #include <stdio.h> /*ここに関数を記述*/ int main(void){ int limit,result; scanf("%d",&limit); result = fibnum(limit); printf("%d\n", result); } という問題です。 私は以下のように考えたのですが… #include <stdio.h> void fibnum(int limit){ int f0, f1; f0 = 0; f1 = 1; printf("%d\n", f0); printf("%d\n", f1); while(1){ f0 += f1; if (f0 > limit)return; printf("%d\n", f0); f1 += f0; if (f1 > limit)return; printf("%d\n", f1); } } int main(void){ int limit, result; scanf("%d",&limit); result = fibnum(limit); printf("%d\n", result); return result; } 実行すると 「S:\デスクトップ\v\v.cpp(30) : error C2440: '=' : 'void' から 'int' に変換することはできません。(新しい動作 ; ヘルプを参照) void 型の式は他の型へ変換できません。 cl.exe の実行エラー」 と出てきてしまいます。 考えてみたのですが、エラーの理由がよくわかりません。 どこが間違っているのかなど、ご指摘いただければ嬉しいです。

  • C言語ソースコードに関する質問です。

    以下の数列について,初項から第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)); } 正しソースコードを教えてください! よろしくお願いします。

  • フィボナッチ数列の求め方

    配列を使ったフィボナッチ数列の10番目の求め方がよくわかりません。 一応自分でつくったのをのせます。最終的にfibona(10)=55というふうにしたいです。 #include <stdio.h> int main(void){ int i; int result[11]; result[0]=1; result[1]=1; for(i=2;i<=10;i++){ result[i]=result[i-1] + result[i-2]; }; printf("fibona(10)=%d\n",result[10]); }; return(0); }