[VBA] トリボナッチ数列 (Tribonacci Sequence)

VBA 数学演習問題がスタートしました。

[VB-01] トリボナッチ数列 (Tribonacci Sequence)

 次のように、ある項が前の $3$ 項の和で定義される数列
 
\[\begin{align*}&T_0=0,\quad T_1=0,\quad T_2=1\\[6pt]
&T_{n+3}=T_{n+2}+T_{n+1}+T_{n}\quad (n\geq 0)\end{align*}\]
トリボナッチ数列 (Tribonacci Sequence) とよびます。この数列の初項 $T_0$ から $15$ 番目の項 $T_{14}$ までを表示させる Subプロシージャ (Subroutine) を記述してください。
 

VB-01 のヒント(配列を使ってみましょう)

 数列を扱うコードは配列と相性がいいです。

 問題文では $T_n$ の初項を $T_0$ としているので、配列の下限値を設定する Option Base は 0 のままがよいでしょう(デフォルトで 0 になっているので、宣言セクションには何も書く必要はありません)。

 本問に限りませんが、実行結果は MsgBox で表示するよりも Debug.Print (Debugオブジェクトの Printメソッド) を使った方が便利です(イミディエイトウィンドウで実行結果を確認しながらコードを修正できます)。
 
 

VB-01 の解答 (15 要素の配列を用意します)

 次のような手順で処理を実行します。

 トリボナッチ数列の各項を入れるために、Dim ステートメントで 15 個の要素からなる配列変数を宣言します。

 t(0), t(1), t(2) には数列の初期値 $T_0$, $T_1$, $T_2$ の値を入れます。

 フィボナッチ数列の漸化式
\[T_{n+3}=T_{n+2}+T_{n+1}+T_{n}\quad (n\geq 0)\]を配列を使って

t(k) = t(k - 1) + t(k - 2) + t(k - 3)

と表し、変数 k を 3 から 14 まで動かしながら、配列に値を代入していきます。解答コードは次のようになります。

'トリボナッチ数列 (Tribonacci Sequence)

Sub Tribonacci()

 'ループ処理に用いる変数を長整数型で宣言
 Dim k As Long

 '15 個の要素からなる配列を長整数型で宣言
 Dim t(14) As Long

 '初期値の代入
 t(0) = 0
 t(1) = 0
 t(2) = 1

 't(3) ~ t(14) の計算
 For k = 3 To 14
  t(k) = t(k - 1) + t(k - 2) + t(k - 3)
 Next k

 't(0) ~ t(14) の表示
 For k = 0 To 14
  Debug.Print "T(" & k & ") = " & t(k)
 Next k

End Sub

 このマクロを実行すると、次のように表示されます。

 T(0) = 0
 T(1) = 0
 T(2) = 1
 T(3) = 1
 T(4) = 2
 T(5) = 4
 T(6) = 7
 T(7) = 13
 T(8) = 24
 T(9) = 44
 T(10) = 81
 T(11) = 149
 T(12) = 274
 T(13) = 504
 T(14) = 927

 k ≥ 3 では T(k) が前 3 項の和になっていることを確認しておいてください。
 たとえば、T(6) = 7, T(7) = 13, T(8) = 24 なので、

T(9) = T(8) + T(7) + t(6) = 44

となっています。

スポンサーリンク
スポンサーリンク
末尾広告
末尾広告

コメント

  1. たけちゃん より:

    x^2-c=0は重解を持ちません.
    題意の条件を満たすようにするには,
    p,qを実数とすることをあきらめるしかないと思います.
    (p,qを実数とする意図であれば,それを明示しないとまずいですね.)

    • Blog Cat より:

      御指摘の通りです。申し訳ありません。
      問題を作成する時に (x^2+x+1)(x^2-1) という因数分解された 4 次式をつくったのですが、なぜか x^2 – 1 のところを「重解」というように勘違いして問題文を書いてしまいました。正しくは虚数解と実数解を 2 つずつです。問題文と解答はすでに訂正しておきました。

コメントをどうぞ

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください