終了条件付きで自分自身を呼び出す
再帰するFunctionで5の階乗を求めます。終了条件と入力範囲を設けて無限呼び出しやLongの範囲超過を防ぎます。
実行前に確認
- 0または1で呼び出しを終える条件が必要です。終了条件がなければ呼び出しを繰り返してメモリ不足になります。
- Longで扱える階乗はこの例では0~12に制限します。13以上はオーバーフローするため、例ではエラーとして拒否します。
- Excel実機での動作は未確認です。コピーした練習用ブックで試してください。
1サンプルコード
Option Explicit
Sub Example7057()
Dim n As Long
n = 5
MsgBox n & " の階乗: " & Factorial7057(n)
End Sub
Private Function Factorial7057(ByVal n As Long) As Long
If n < 0 Or n > 12 Then
Err.Raise vbObjectError + 7057, "Factorial7057", "nは0~12にしてください。"
End If
If n <= 1 Then
Factorial7057 = 1
Else
Factorial7057 = n * Factorial7057(n - 1)
End If
End Function図で見る5の階乗を再帰で計算する
イメージ図同じ関数へ小さくした数値を渡し、終了条件から結果を返します。
n = 5で呼び出す
Example7057からFactorial7057(5)を呼び出す
1まで小さくして計算
5 → 4 → 3 → 2 → 1。1で再帰を止め、戻りながら順に掛ける
120を表示
Factorial7057が120を返し「5 の階乗: 120」を表示
同じ標準モジュールに補助Functionも貼り付けます。入力は0~12に制限し、13以上などはエラーにします。
コードの処理を説明する模式図です。実際の画面や実行結果を撮影したものではありません。
使い方・実行手順を確認する4つの手順で、コードの使い方を確認できます
- 1
Windows版デスクトップExcelの練習用ブックを.xlsm形式で保存します。Alt+F11でVBEを開き、[挿入]→[標準モジュール]で作った空のモジュールに、Option Explicitから末尾まで、この例だけを貼り付けます。
- 2
下のFactorial7057関数も含めて、同じ標準モジュールに貼り付けます。実行するのはExample7057です。
- 3
Example7057のSub内にカーソルを置き、F5キーで実行します。
- 4
5×4×3×2×1を計算した「5 の階乗: 120」が表示されます。