皆さん、こんにちは。2021年4月よりVBAを勉強し始めて、現在1年8ヶ月目となりました。(現在、2022年11月26日)
今回は私が学習していく中で、よくつまづいていた「再帰関数(再帰呼び出し)」について備忘録的に記していきたいと思います。
正直、学習中は数時間考え込んでもアルゴリズムを理解できなかったですし、未だに使いこなせる自信はありません。しかし、それを逆手に取り、素人が素人目線で解説しておりますので、
是非、参考にしてください。
まずは、再帰関数とは・・・
『あるプロシージャの処理内部で再びそのプロシージャ自身を呼び出す処理』
実際、このブログ記事をお読みのあなたは、上記の内容自体はわかっていると思いますが、そのコードの動きを理解できなくてサイト検索していることだと思います。
基本的な再帰関数のコードの動きを検証してみる
Sub test()- func (0)
- End Sub
Private Function func(ByVal r As Long) As Long- If r < 5 Then
- func (r + 1)
- End If
- End Function
上記、コードについては、引数0の値で、ファンクション関数を呼び出しています。funcプロシージャ内で、func(r+1)が呼び出し元となり、再帰関数が発動しています。引数r+1で1が加わっていき、rが5になるとプロシージャが終了します。
「画像:再帰呼び出し解説」の④については、未処理の4~0が順番に処理されていきプロシージャ終了となります。
これらの引数の動きについては、Debug.Printやローカルウィンドウで丁寧に確認することをお勧めします。データが積み上げ順と反対に取り出されていくんですね。
階乗計算
これについては定番問題です。
理解のポイント
- コードの動きとして、積み上げ順序と取り出し順序を理解することが必要
- 呼び出し元について、saikiがたくさん出てきているのでどれが呼び出し元であるかを理解することが必要です。あくまで、このコードの再帰呼び出し元はelse以降のsaiki(n-1)です。引数のあるsaikiはこれしかないです。
- 引数の取り出しが終わった時点で、プロシージャは終了します。よって、saiki=1が解と思いがちですが、あくまで引数5の取り出しが終わった時点がプロシージャの終了で解は120となります。
上記3点を押さえれば、理解が進むと思います。
筆者おすすめ!!「たった1日で即戦力になるExcelマスター講座」受講体験談 (VBAマスター講座もあります)はこちら↓↓
まとめ
いかがだったでしょうか。コードの動きを正確に理解できないと、なかなか再帰呼び出しを使いこなすのは難しいかもしれないですね。
最後にサイト「エクセルの神髄」より良問のリンクを貼らせていただきます。
次回以降、VBA学習の中で気になったことをサイトアップしていきますので、楽しみにお待ちください。
コメント