プロが教える店舗&オフィスのセキュリティ対策術

最近プログラミングを勉強し始めた者です。
教科書と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…」と始められるかが分かりません。

まだこの単元を消化しきっていないため、質問内容もままならない点がありますが、ご理解できましたら是非回答をよろしくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

ご回答どうもありがとうございます。

Function keisan(n,a1,a2)
という発想は無かったのでとても参考になりました。

只今、実行してみましたところ、コンパイルエラーで「引数が省略されている」と出てしまいましたが、何とか自分でもこのエラーは解消できるように努力してみます。
このことに関して、引き続きご教授の方も受け付けております。

とても参考になりました。
ありがとうございました。

お礼日時:2009/01/20 23:27

しまった。

内部でも関数を呼び出していたのでした。
>コンパイルエラーで「引数が省略されている」
引数は普通、省略不可能ですので、言い換えれば「必要な個数の引数が指定されていません」ということでして。
>keisan = keisan(n - 1) + keisan(n - 2)
正しくは以下のとおりです。(きっと・・(汗))
keisan = keisan(n - 1,a1,a2) + keisan(n - 2,a1,a2)
    • good
    • 0
この回答へのお礼

ありがとうございました。
なるほど、エラーはそういうことを言っていたんですね!
日々勉強です。

とても参考になりました。
お世話になりました。

お礼日時:2009/01/21 23:03

If n < 3 Then


 ↓
If n < 2 Then

1番目からじゃなく、0番目から始めれば8番目は34になります。

この回答への補足

ご回答ありがとうございます。
恐れ入りますが、

If n < 3 Then
keisan = 1

この部分で「もしも~~の場合、1と2を~~に入れる」のような記述は出来ないものでしょうか?

と言うのも、実を申しますと将来的にシートの読み込みをさせたく、任意の2つの数字を入れるとフィボナッチ風(?)の数列を発生させるようにすると面白いかな、と勝手に考えています。
このようなことをするためには、まず上記の部分で「○○=1 ○○=2」のような書き方にするのが第一歩目かな、と考えたのですが考え方は的外れでしょうか?

補足日時:2009/01/20 06:49
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!