【VBA】再帰関数で解くフィボナッチ数列!数学的定義をそのままコードにする美学
数学的な美しさを持つ「フィボナッチ数列」。前の2つの数字を足すと次の数字になるというシンプルなルールですが、これをVBAで実装する場合、「再帰(Recursive)」という手法を使うと、驚くほど直感的でエレガントなコードになります。
1. 仕様:フィボナッチ数列とは?
以下のルールで並ぶ数字の列です。プログラミングでは、n番目の数字を求める関数を作成するのが一般的です。
・0番目は 0、1番目は 1
・n番目は「(n-1)番目 + (n-2)番目」
[ 数列の例 ]
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
2. アルゴリズム:自分自身を呼び出す「再帰」の構造
ポイント:n=0 または 1 の時は、決まった値を返す
再帰関数とは、関数の中で自分自身を呼び出す手法です。フィボナッチの定義 $F(n) = F(n-1) + F(n-2)$ をそのまま記述できるのがメリットですが、無限に呼び出し続けないよう、n=0 や n=1 の時は計算せずにその値を返すというルールを最初に記述するのが鉄則です。
Step 1: Fib(4) を呼び出し
Fib(3) + Fib(2) の計算を開始。
Step 2: 枝分かれ
Fib(3) はさらに Fib(2) + Fib(1) に分解される。
Step 3: 最小単位への到達
分解を繰り返し、nが 1 や 0 に到達したら、決まった値(1 や 0)を返す。
Step 4: 合流
返ってきた数値が足し算されながら親へ戻っていき、最終的な答え(3)が導き出される。
3. サンプルコード(そのままコピーOK)
Functionの中で自分自身を呼び出している点に注目してください。非常にスッキリとした記述になります。
Function Fibonacci(n As Long) As Long
If n <= 0 Then
Fibonacci = 0 ' 0の時は0を返す
ElseIf n = 1 Then
Fibonacci = 1 ' 1の時は1を返す
Else
' 自分自身を呼び出して足し算する(再帰)
Fibonacci = Fibonacci(n - 1) + Fibonacci(n - 2)
End If
End Function
' 実行用プロシージャ
Sub RunFibonacci()
Dim i As Long
For i = 0 To 10
Debug.Print Fibonacci(i)
Next i
End Sub
4. 実行結果
イミディエイトウィンドウには、加算の連鎖によって生成された数列が次のように表示されます。
1
1
2
3
5
8
13
21
34
55
1. 技術的な補足: 再帰はコードが短くなる一方で、n が大きくなると計算回数が爆発的に増えるという弱点があります。VBAで n = 40 を超えると処理が極端に重くなるため、大きな値を扱う場合は、以前紹介したループ処理で積み上げる方が実用的です。
2. エンジニアの視点: 再帰は「分割統治」というアルゴリズムの基本思想を学ぶのに最適です。Javaなどのモダンな言語でも使われる手法ですが、VBAでこれをサラッと実装できると、論理的思考ができる「いけいけ」なエンジニアとして一目置かれること間違いなしです。
5. まとめ
「n=0, 1ならこの値を返す」という基本さえ押さえれば、複雑な計算も再帰でシンプルに記述できます。フィボナッチ数列のように、定義がそのまま形になるプログラミングの快感をぜひ味わってみてください。用途に応じてループと再帰を使い分けられるようになれば、あなたのエンジニアとしての引き出しは確実に増えるはずです。