dポイントプレゼントキャンペーン実施中!

現在、大学の講義でプログラミングを学んでいます。
以下の問題が全く歯が立たないため困っています。
分かる方がいらしたら、どうか教えてください。お願いします。


次の数列はフィボナッチ数列と呼ばれる。
1,1,2,3,5,8,13,21・・・
この数列は、a(1)=1、a(2)=1、a(n)=a(n-1)+a(n-2) (n>=3)で定義される。
(1)
B2セルに3以上の整数をnの値として入力すると、C2セルにa(n)の値を出力するプログラムを作成せよ。
(2)
a(n)の値が初めて1000を超えるnの値をB2セルに、そのときにa(n)の値をC2セルに入力するプログラムを作成せよ。

以上が問題です。

ちなみに、
私はVBAはおろか、Excelすら大学生になるまでほとんど使ってきませんでした。
VBAで学んだことは「IFを用いた条件構文」、「繰り返し構文 For ~Next」、
「繰り返し構文 Do~Loop」程度です。

A 回答 (3件)

No.2です。


失礼しました。(2)でnの値をB2セルに入れるの忘れてました。

Sub ex02()
Dim n As Long
n = 3
Do Until (((1 + Sqr(5)) / 2) ^ n - ((1 - Sqr(5)) / 2) ^ n) / Sqr(5) > 1000
n = n + 1
Loop
Cells(2, 2).Value = n
Cells(2, 3).Value = (((1 + Sqr(5)) / 2) ^ n - ((1 - Sqr(5)) / 2) ^ n) / Sqr(5)
End Sub
    • good
    • 1

No.1さんのが正解です。


というか題意に沿ったコードです。

以下、反則ワザ(?)の解答例。

Sub ex01()
Cells(2, 3).Value = (((1 + Sqr(5)) / 2) ^ Cells(2, 2).Value - ((1 - Sqr(5)) / 2) ^ Cells(2, 2).Value) / Sqr(5)
End Sub

Sub ex02()
Dim n As Long
n = 3
Do Until (((1 + Sqr(5)) / 2) ^ n - ((1 - Sqr(5)) / 2) ^ n) / Sqr(5) > 1000
n = n + 1
Loop
Cells(2, 3).Value = (((1 + Sqr(5)) / 2) ^ n - ((1 - Sqr(5)) / 2) ^ n) / Sqr(5)
End Sub


参考ページ
http://mathtrain.jp/fibonacci
    • good
    • 0

'標準的な解答


再帰型と非再帰型、両方で作りました。

Sub Question1()
 Dim x As Long, y As Long, i As Long
 Dim t As Long
 Dim n As Long
 If Range("B2").Value = "" Then MsgBox "B2に数値がありません。", vbExclamation: Exit Sub
 If Not IsNumeric(Range("B2").Value) And 3 < Range("B2").Value Then
  MsgBox "3以上の数値を入れてください", vbExclamation
  Exit Sub
 End If
 n = Range("B2").Value
 x = 1: y = 1
 For i = 3 To n
  t = y: y = x + y
  x = t
 Next i
 Range("C2").Value = y
End Sub
Sub Question2()
 Dim n As Long
 Dim ret As Long
 n = 3
 Do
  n = n + 1
  ret = fibo(n)
 Loop Until ret > 1000
 Range("B2").Value = n
 Range("C2").Value = ret
End Sub
Private Function fibo(n As Variant)
If n = 1 Or n = 2 Then
  fibo = 1
Else
  fibo = fibo(n - 1) + fibo(n - 2)
End If
End Function

'おまけ:(上記のコードとは競合する可能性がありますから、シートは変えてください。)
'シートモジュール(シートタブを右クリックして、コードの表示を所をクリックすると、開いたペインに貼り付けます)

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim x As Long, y As Long
 Dim i As Long, t As Long
 If Target.Address(0, 0) <> "B2" Then Exit Sub 'B2セル以外ダメ
 If Target.Count > 1 Then Exit Sub '貼り付けはダメ
 If IsNumeric(Target.Value) Then
  If Int(Target.Value) <> Target.Value Or Target.Value < 3 Then
   MsgBox "3以上の整数を入れてください。", vbExclamation
   Exit Sub
  End If
 Else
  MsgBox "3以上の整数の数字を入れてください。", vbExclamation
  Exit Sub
 End If
 'ここから以下が計算
 x = 1: y = 1
 For i = 3 To Target.Value
  t = y: y = x + y
  x = t
 Next i
 
 Application.EnableEvents = False
 Range("C2").Value = y
 Application.EnableEvents = True
End Sub
    • good
    • 1

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