基礎から学ぶVBAプログラミング教室

教えることは、二度学ぶこと

スポンサーリンク

【再帰処理をマスターしよう】VBAで階乗の計算をしてみる

f:id:excel-accounting:20180729205729j:plain:w450

再帰処理で階乗計算をしよう

まずは用語の確認から

再帰とは

再帰(さいき)は、あるものについて記述する際に、記述しているものそれ自身への参照が、その記述中にあらわれることをいう。

ちょっと難しいですね。

この記事でしっかり解説していきますよ~

nの階乗とは

1~nまでの積です。
n! = n × (n-1) ×・・・× 3 × 2 × 1

n=5の場合、

5!=5×4×3×2×1
→120

コード

下記のコードをF8でステップ実行してみてください。

Sub main()
    
    Dim answer As Long
    answer = nの階乗(5)
    
    Debug.Print answer
    
End Sub

Function nの階乗(n As Long) As Variant

    If n = 1 Then
        nの階乗 = 1
    Else
        nの階乗 = n * nの階乗(n - 1)
    End If
    
    Debug.Print n & "の階乗は" & nの階乗

End Function


Functionプロシージャのこの部分が再帰です。

nの階乗 = n * nの階乗(n - 1)

nの階乗nの階乗を呼び出してます。

やさしい解説

f:id:excel-accounting:20180729212030p:plain:w400

階乗計算はこんな風に分解できますね。
(上記の図と同じことを書いてます)

5の階乗=5 × 4の階乗

4の階乗=4 × 3の階乗

3の階乗=3 × 2の階乗

2の階乗=2 × 1の階乗

1の階乗=1


数字をすべてnに置き換えると、

nの階乗=n × (n-1)の階乗

と表現できます。


ネットで検索すると「再帰とは自分で自分を呼び出すこと」と書いてある記事が多いですよね。

私は、この「自分を呼び出す」という表現がどうもしっくりきませんでした。

f:id:excel-accounting:20180424112139p:plain:w150


それよりも、単に「プロシージャが関数を呼び出す」とシンプルに考えた方が理解しやすいです。


【考え方】
[5の階乗]は[5×4の階乗]である

[4の階乗]を求めるために、[nの階乗]関数に引数4を渡して呼び出す

[4の階乗]は[4×3の階乗]である。

[3の階乗]を求めるために、[nの階乗]関数に引数3を渡して呼び出す

 :
 :
(以下同じ)


呼び出す→呼び出す→・・・呼び出し元に戻る→呼び出し元に戻る

のイメージがつかめると「理解できた!」感じがあります。


とはいっても、文章だけでは難しいのでこれもLet's図解

コードをステップ実行しながら①~⑧の流れを確認してみてくださいね!


f:id:excel-accounting:20180729225908p:plain:w500



再帰処理をもっと勉強したい!というみなさん、

私がいつも勉強しているthomさんの記事、フォルダ階層を辿って戻る図解がとてもわかりやすいですよ!
VBA フォルダー階層を辿るサンプル ~ 再帰をマスターする - t-hom’s diary

スポンサーリンク