- ベストアンサー
PHP初学者のためのフィボナッチ数列の問題と解答
- PHPの勉強を初めて間もない初学者が、参考書に出ているフィボナッチ数列の問題について質問です。
- 質問文章の中で演習問題の内容と解答を示しており、自己解決できない性格上、解答の確認と説明をお願いしています。
- 質問者はフィボナッチ数列を計算するスクリプトをfor文やwhile文を使って実装し、フィボナッチ数列の値が1000億を超えるのは第何項かを調べるスクリプトも作成しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> <(1)についての解答> 50番目の項目を求めるという問題なら間違ってはいませんが、単に50項までのフィボナッチ数列を求めるという問題なら第1項から第50項までの数列を出力する必要があるように思います。 > <(2)についての解答> for文は for(A; B; C;) { // 処理 } とあった時、 ループの最初にAが実行され、次に各回の最初にBが評価され、処理が終わったループの最後でCが実行されます。 つまり、($i番目の処理結果としての)ループの終了判定 $sta < $n+1 が評価される前に $i++で$iはインクリメントされてしまっています。つまり、上のプログラムでは実際に100000000000を超えた時の項目番号より一つ大きな値の$iが出力されてしまいます。 (正解は54番目だけど、55番目と表示されます)
その他の回答 (1)
- yyr446
- ベストアンサー率65% (870/1330)
PHPの練習にはならないけど、フィボナッチ数列の 一般項は近似式で検算できるそうな。 第n項目の答えは、 $n=n+1.0; floor(pow(1.61803398874989484820,$n)/sqrt(5.0)+0.5); だそうな。 ※1.61803398874989484820は黄金比
お礼
フィボナッチ数列について、詳しく調べて頂きありがとうございます! 早速、参考URLの方も拝見しました。が・・・ 難しい!!(^_^;) なんとなく、回答してくださった構文がどれとどれにあたるかは分かったの ですが、如何せん近似式がどういうものかしっかりとまだつかみきれていな い為、今後、しっかりと勉強した上で”yyr446”さんの教えて下さった今回 の制御構文を見直し、そのとき完全に理解してみたいと思います! このような質問にお時間を割いて頂きありがとうございました。
お礼
<(1)について> 確かに、50項までの数列を出力するというのを勝手に 50番目の項目を求めるものとして作っていました。 ご指摘ありがとうございます!また新たに作り直してみたいと思います。 <(2)について> ループの終了判定 $sta < $n+1 が評価される前に $i++で$iはインクリ メントされてしまうとは知りませんでした・・・。 とても参考になります。 どちらも大変分かり易い説明で、また一つ、プログラムについての 理解が深まりました。 このような初歩的質問にお時間を割いて頂き本当にありがとうございました!