- ベストアンサー
再帰構造のアルゴリズムで困っています。
最近プログラミングを勉強し始めた者です。 教科書とWebを使って勉強しているのですが、なかなか厳しいです。 初歩的な質問であると思いますがお許しください。 フィボナッチ数列の8番目の数字を再帰構造を用いて表示させるプログラムを作りました。 Sub saikikouzou() n = 8 Cells(1, 1) = keisan(n) End Sub Function keisan(n) If n < 3 Then keisan = 1 Else keisan = keisan(n - 1) + keisan(n - 2) End If End Function 一般的にフィボナッチ数列と言われると「1.1.2.3.5.8.13.21」という数列であると理解しています。上記のプログラムもそのつもりで作成しました。 しかし今は「1.2.3.5.8.13.21.34」という数列の8番目を再帰構造を使って求めたいと考えています。 つまり、最初の数字を「1,1…」と始まるのではなく「1.2…」と始めたいのです。 私のプログラムだと、 If n < 3 Then keisan = 1 の部分で最初の数字が「1.1」と決めているため、良くないことは理解できましたが、どうすれば「1.2…」と始められるかが分かりません。 まだこの単元を消化しきっていないため、質問内容もままならない点がありますが、ご理解できましたら是非回答をよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
keisan(n)に、初項、第2項を追加して渡す、というのはいかがでしょう? #蛇足ながら、この場合、再帰構造を使用しないほうがよいのですが。 #計算量がnの2乗のオーダーで増えますから。 #(計算回数はフィボナッチ数列そのもの?) Sub saikikouzou() n = 8 'a1=Cells(2, 1) 'a2=Cells(2, 2) a1=1 a2=2 Cells(1, 1) = keisan(n,a1,a2) End Sub Function keisan(n,a1,a2) If n = 1 Then keisan = a1 Else If n = 2 Then keisan = a2 Else keisan = keisan(n - 1) + keisan(n - 2) End If End If End Function
その他の回答 (2)
- osu_neko09
- ベストアンサー率48% (56/115)
しまった。内部でも関数を呼び出していたのでした。 >コンパイルエラーで「引数が省略されている」 引数は普通、省略不可能ですので、言い換えれば「必要な個数の引数が指定されていません」ということでして。 >keisan = keisan(n - 1) + keisan(n - 2) 正しくは以下のとおりです。(きっと・・(汗)) keisan = keisan(n - 1,a1,a2) + keisan(n - 2,a1,a2)
お礼
ありがとうございました。 なるほど、エラーはそういうことを言っていたんですね! 日々勉強です。 とても参考になりました。 お世話になりました。
If n < 3 Then ↓ If n < 2 Then 1番目からじゃなく、0番目から始めれば8番目は34になります。
補足
ご回答ありがとうございます。 恐れ入りますが、 If n < 3 Then keisan = 1 この部分で「もしも~~の場合、1と2を~~に入れる」のような記述は出来ないものでしょうか? と言うのも、実を申しますと将来的にシートの読み込みをさせたく、任意の2つの数字を入れるとフィボナッチ風(?)の数列を発生させるようにすると面白いかな、と勝手に考えています。 このようなことをするためには、まず上記の部分で「○○=1 ○○=2」のような書き方にするのが第一歩目かな、と考えたのですが考え方は的外れでしょうか?
お礼
ご回答どうもありがとうございます。 Function keisan(n,a1,a2) という発想は無かったのでとても参考になりました。 只今、実行してみましたところ、コンパイルエラーで「引数が省略されている」と出てしまいましたが、何とか自分でもこのエラーは解消できるように努力してみます。 このことに関して、引き続きご教授の方も受け付けております。 とても参考になりました。 ありがとうございました。