ページ 1 / 1
フィボナッチ数列
Posted: 2008年11月26日(水) 12:55
by 初心者
フィボナッチ数を次の手順で求めるプログラムを作成せよ。
再帰関数 int fib(int n)を定義し,再帰呼出しによりfib(n)の値を求める。
こちらも,n=30までのフィボナッチ数を求めて表示せよ。
で下のようにつくりました。コンパイルはできましたが
実行すると
第何項までのフィボナッチ数? n=30
Segmentation fault (core dumped)
のようにでてきてmもとめられません。
やはりf0=0とf1=1を定義しないとできないのでしょうか?
教えてください
#include <stdio.h>
int fib(int);
main()
{
int n, i ,f;
printf("第何項までのフィボナッチ数? n=");
scanf("%d",&n);
for(i=2; i<=n; i++)
{
f=fib(n);
printf("F%d = %d\n",n, fib);
}
}
fib(int n)
{
int f;
f=fib(n-1)+fib(n-2);
}
Re:フィボナッチ数列
Posted: 2008年11月26日(水) 13:03
by Mist
コンパイル時にワーニングが出ていませんか?
おかしなところがいくつかあります。
> f=fib(n);
fib関数の戻り値を誰も使っていない。
> printf("F%d = %d\n",n, fib);
この場合、2個目の%dに出力される値はfib関数のアドレスになっちゃうけどそれで正しいの?
> fib関数
戻り値(return)がない。
この関数には、終わる(再帰呼び出ししない)ための条件がないから永久に再帰呼び出しを行ってダウンする。
Segmentation fault (core dumped)なるのはこのため。
Re:フィボナッチ数列
Posted: 2008年11月26日(水) 13:07
by Dixq (管理人)
警告は出るはずだと思います。私の環境でコンパイルしたところ
1>(11) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>(37) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>(43) : warning C4508: 'fib' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。
と表示されました。
プログラムを理解して書いていますか?なんとなく感覚でかいていっていないでしょうか。
・fibの返り値をfに格納しているのだからfを表示させましょう。
・fibは関数ですから、関数として呼びましょう。
・関数の前には型の名前を書きましょう。この場合mainもfibもintでいいです。
・fibはせっかく計算しても計算結果が返りません。計算結果をreturnさせましょう。
・fibにはnを渡せばよいだけですから、for文で何度も回す必要はありません。同じ計算結果が何度も表示されるだけです。
また参考になりそうな資料を検索で見つけるのも大事です。
「フィボナッチ プログラム」
http://www.google.co.jp/search?hl=ja&rl ... %83%A0&lr=
「フィボナッチ C言語」
http://www.google.co.jp/search?hl=ja&rl ... %AA%9E&lr=
など参考にして下さい。
考えられる限りでいいので、修正してまた投稿してみて下さい。
Re:フィボナッチ数列
Posted: 2008年11月26日(水) 13:08
by non
>やはりf0=0とf1=1を定義しないとできないのでしょうか?
定義しないとできません。
Re:フィボナッチ数列
Posted: 2008年11月26日(水) 13:29
by 初心者
参考に作り替えてみましたが全くだめでした
こんどは実行したら
F30 = -1209225228
が30個表示されるようになってしまいました。
どうすればいいですか。
再帰関数を習ったばかりでよく理解できていないかもしれません。
#include <stdio.h>
int fib(int);
int main()
{
int n, i ,f;
printf("第何項までのフィボナッチ数? n=");
scanf("%d",&n);
for(i=0; i<=n; i++)
printf("F%d = %d\n",n, f);
}
fib(int n)
{
if(n=0) return 0;
int f;
f=fib(n-1)+fib(n-2);
return;
}
Re:フィボナッチ数列
Posted: 2008年11月26日(水) 13:35
by 初心者
> >やはりf0=0とf1=1を定義しないとできないのでしょうか?
>
> 定義しないとできません。
どこにどのように定義すればいいのですか?
関数内にf0=0; f1=1;をいれたのですが
エラーでinvalid lvalue in assignmentの様に表示されるようになってしまったのですが
Re:フィボナッチ数列
Posted: 2008年11月26日(水) 13:42
by non
>どこにどのように定義すればいいのですか?
>if(n=0) return 0;
この部分がf0を定義したことになります。
同様にf1も定義します。
(ただし、等しい時は == です)
でも、再帰呼び出しどころか、あまりにもC言語の理解が乏しいようです。
Mistさんや、管理人さんが言われたことをもう一度チェックしてください。
Re:フィボナッチ数列
Posted: 2008年11月26日(水) 14:16
by 初心者
>if(n=0) return 0;
この部分がf0を定義したことになります。
同様にf1も定義します。
まだプログラミングをはじめて2ヶ月ぐらいですのでもう一度復習がてらチェックしてみようと思います。
あと
#include <stdio.h>
int fib(int);
int main()
{
int n, i, f;
printf("第何項までのフィボナッチ数? n=");
scanf("%d",&n);
for(i=0; i<=n; i++)
{
f=fib(n);
printf("F%d = %d\n",n,f);
}
}
fib(int n)
{
if(n=0) return 0;
if(n=1) return 1;
int f;
f=fib(n-1)+fib(n-2);
return(f);
}
にすると
F30 = 1
F30 = 1
F30 = 1
F30 = 1
が続きます
F0からF30までを表示できるようにするにはどうすればいいですか。
どうやってもうまくいかないので
Re:フィボナッチ数列
Posted: 2008年11月26日(水) 14:32
by 御津凪
if(n=0) return 0;
if(n=1) return 1;
じゃなくて、
if(n==0) return 0;
if(n==1) return 1;
では?
Re:フィボナッチ数列
Posted: 2008年11月26日(水) 14:44
by mats
for文でiをインクリメントしているのに
f = fib(n);
では、毎回同じ計算をしてしまいます。
f = fib(i);
として、さらにprintfの中でもnではなくiを表示させないといけません。
Re:フィボナッチ数列
Posted: 2008年11月26日(水) 14:46
by non
関数には戻り値のタイプを書きます。
int fib(int n)
Re:フィボナッチ数列
Posted: 2008年11月26日(水) 15:44
by Dixq (管理人)
手当たり次第変更してみるのではなく、何故そうなるのか、
そう書くとどういう振る舞いになるのかをしっかり考えて書いて行ってみましょう。
また、自分の実力では手に負えそうにない問題は、まず分解して考える事が大事です。
・数値を入力して表示するだけのプログラム
・n項のフィボナッチ数列の値を表示するプログラム
これを作った後、これらをくっつけて、課題を完成させるなど。
for文の回し方がわからないなら、まずn項だけ表示させてみるなど、わかるところから完成させてみましょう。
そうしないと、どこがおかしいのかわからなくなってしまいます。
また、最初のうちは、プログラムに注釈を書きながら作っていくとよいと思います。
回答するほうも、どこまでわかっているかが明確に解りますから、適確なアドバイスが出来ます。
例
/* 入出力関係の標準ライブラリ stdio.h をインクルードする */
#include <stdio.h>
/* プロトタイプ宣言 */
/* 引数により指定されたのフィボナッチ数列の項の値を求める関数 */
int fib(int n);
/* メイン関数 */
int main()
{
/* n : 計算するフィボナッチ数列の項を格納する為の int 型変数 */
int n;
/* i : for 文でループ回数をカウントする為の int 型変数 */
int i;
/* f : 計算したフィボナッチ数列の値を格納する為の int 型変数 */
int f;
/* キーボード入力を促すための説明を表示 */
printf("第何項までのフィボナッチ数? n=");
/* 変数 n に、キーボード入力された計算するフィボナッチ数列の項を格納 */
scanf("%d",&n);
/* フィボナッチ数列を項 0 から n までループして計算する */
/* 計算される回数は n+1 回であることに注意 */
for(i=0; i<=n; i++)
....(略)
}
/*****************************************************************/
/* 関数名とフォーマット */
/* int fib(int n) */
/* 概要 */
/* 引数により指定されたのフィボナッチ数列の項の値を求める */
/* 引数 */
/* n : 計算するフィボナッチ数列の項 */
/* 関数値 */
/* -1 : 異常終了 */
/* 自然数 : 引数 n が示す項の値 */
/* 補足 */
/* この関数は再帰関数で表現している。 */
/* 40項以上ほどになると計算に非常に時間がかかるので注意 */
/*****************************************************************/
int fib(int n){
...(略)
}
Re:フィボナッチ数列
Posted: 2008年11月26日(水) 19:30
by Mist