質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

8935閲覧

while文を使ったフィボナッチ数列の理解に苦しんでます。

prog1717nm

総合スコア56

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/07/25 11:09

public static int fibL(int n) { int i=1, f_1=0, f_2=1, f=1; while(i<=n) { f = f_1+f_2; f_2= f_1; f_1 = f; ++i; } return f; }

上のプログラムはフィボナッチ数をループで計算するfibLを定義しています。
理解できない点が2つあります。
1つ目は『f=1;』です。なぜ初期値を1にする必要があるのですか?このfというのは第3項以降を表しているんですよね?
2つ目は 『f_2= f_1;f_1 = f;』です。これって何をしてるんでしょうか。フィボナッチ数列ってそもそも前の2項をたしていくんですよね?足しているようにみえません。
フィボナッチ数列は『0,1,1,2,3,5,8...』ですよね。それを表しているプログラムだというのは分かるんですが、上手く読めません。教えて欲しいです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

このコードの流れを見るとf_1とf_2の初期値が違うんじゃないかと思いますが、一応動作の意図を解説したいと思います。

仰るとおりフィボナッチ数列は「前2項の和」で数列を作っていくものです。なのでその「前2項」さえわかっていれば項を順次計算することができます。whileでやっているのは前2項の和を計算して項を算出して、その前2項に当たる数字を移動する、という事になります。プログラムでは前2項のうち、1項前がf_1,2項前がf_2,現在計算している項がfに該当します。

例えば第4項を計算する際に「1項前」の第3項と「2項前」の第2項がそれぞれf_1,f_2に入っています。この2項を足して第4項を計算します。これがfに入ります。
次は第5項を計算しようとするわけですが、そのためにはf_1,f_2がそれぞれ第4項、第3項の値になっていなければなりません。そのために、元「1項前」だった第3項を新たに「2項前」に移動させます。「今の項」として計算したfは「1項前」に移動されます。そして、「1項前」と「2項前」を足して第5項を作成します。

これを繰り返しているのがこのプログラムになります。

投稿2016/07/25 15:49

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

prog1717nm

2016/07/26 00:29

最後はなぜ++iなのでしょうか?i++ではダメなのでしょうか?
swordone

2016/07/26 01:57 編集

++iでもi++でも、単独の場合はどちらでも効果は変わりません。
guest

0

疑問があるならば自分で作るのも良いと思いますよ。

同じ結果でもプログラムの書き下し方はたくさんあります。

投稿2016/07/25 12:56

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

####1つ目は『f=1;』です。なぜ初期値を1にする必要があるのですか?このfというのは第3項以降を表しているんですよね?

関数入力の値としてマイナス値が来た時の値なので、関数の仕様によると思います。
引数0~以降で最初の0,1を飛ばした所から開始するので、そもそもどういう仕様の関数なのかイマイチわかりませんが。


####2つ目は 『f_2= f_1;f_1 = f;』です。これって何をしてるんでしょうか。フィボナッチ数列ってそもそも前の2項をたしていくんですよね?足しているようにみえません。

足し算はループの先頭でやってます。その後項を移動する為に変数の代入をしているのです。
fは現在の合計値、f_1は1つ前の値、f_2は2つ前の値で、ループする度に1つずつずれるので代入してます。f_1+f_2で1つ前の値と2つ前の値を足して、現在の値にしています。

投稿2016/07/25 12:28

drednote

総合スコア336

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

それはコード例が悪いように思いますね。
少なくとも、Javaらしいコードではないです。

書き直してみました。

lang

1public static int fibL(int n) { 2 int f = 0, f1 = 0, f2 = 1; 3 for (int i = 1; i <= n; i++) { 4 f = f1 + f2; 5 f2 = f1; 6 f1 = f; 7 } 8 return f; 9}

コーディングルールによっては、変数宣言を同じ行に書くのも許可されない場合がありますが、そこはまあ良いでしょう。


タイトルがwhile文ということなので補足。
上記のfor文は、以下のwhile文とほぼ同義です。

lang

1int i = 1; 2while (i <= n) { 3 // ループ内処理 4 i++; 5}

投稿2016/07/25 12:03

編集2016/07/25 12:06
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問