第10講 ファンクションプロシージャの再帰的使用
第2話 ファンクションプロシージャの再帰的使用による1からnまでの和プログラム解説その1
を実現するプログラム主要部分再掲
Private Sub CommandButton1_Click()
Dim n As Integer
n = Cells(4, 2)
Cells(4, 5) = f(n)
End Sub
Function f(g As Integer)
If g > 0 Then
f = f(g - 1)
Else
f = 0
End If
f = f + g
End Function
解説
まず、社長であるCommandButton1_Clickが社員であるfに仕事を命じます。
1からnまでの和を調べて報告しなさいという命令です。
fはこのとき始めて世に生まれます。
正確に言うと、メモリー上にfが展開されます。
比喩でいうと、CommandButton1_Clickにコールされて、
初めて人形は出現します。
この人形は、この例では引数としてnを渡されます。
人形ははじめに渡された値がnより大きいか大きくないかを調べます。
この例では、最初の人形は3を渡されています。
3は0より大きいですから、
If文の肯定側が実施されます。
f(3)はf(2)に値を問い合わせます。
(f(3)という人形の任務は、
3+2+1を計算して報告することですが、
3+2+1=3+(2+1)ですから、
2+1の結果が分からないと答を出せません。
そこで、f(2)に2+1の答えは何であるか問い合わせるわけです。)
f(3)がf(2)をコールした瞬間に、入れ子式に2番目の人形が出現します。
f(3)という人形の中にf(2)という人形が生まれるのです。
そして、f(2)はf(3)から渡された値2が0より大きいか調べます。
2はもちろん0より大きいですから、f(2)はf(1)に値を問い合わせします。
f(1)がコールされた瞬間に入れ子式の3番目の人形が発生します。
3番目の人形f(1)も引数1が0より大きいかを調べますが、
もちろん0より大きいですから、
f(1)はf(0)に値を問い合わせます。
4個目の人形の出現です。
これが入れ子式人形の1番内側の人形になります。
初めて、引数の値0が0よりは大きくないですから、
If文の否定側
If g > 0 Then
f = f(g - 1)
Else
f = 0
End If
が実行されて、fに初めて0が代入されます。
さらに、
f = f + g (gはf(0)の括弧内の数字)
によって、
f = 0 + 0
の計算から
f = 0
となって、f(1)に戻り値の0が返されます。
この瞬間に1番内側の人形f(0)(4個目の人形)は、消滅します。
任務を終了したからです。
さて、f(0)から0を戻されたf(1)は
If g > 0 Then
f = f(g - 1)
fに0を代入します。
そして、
f = f + g (gはf(1)の括弧内の数字)
から
f = 0 + 1
が計算されて
f = 1
となりそれをf(2)に返します。
f(1)も任務を終了して消滅します。
つまり、3個目の人形が消滅しています。
さて、f(2)はf(1)から返された戻り値1を
f = f(g - 1)
fに代入します。
そして、
f = f + g (gはf(2)の括弧内の数字)
から
f = 1 + 2
が計算されて
f = 3
となりそれをf(3)に返します。
この瞬間に2個目の人形であったf(2)が消滅します。
f = f(g - 1)
によってfに3が代入されます。
最後、
f = f + g (gはf(3)の括弧内の数字)
から
f = 3 + 3
が計算されて
f = 6
そして、1個目の人形であるf(3)は6をCommandButton1_Clickに返して、
すべての人形が消滅しますが、
6が
Cells(4, 5) = f(n)
によってE4に表示されています。
どうして、以上の操作で1+2+3=6が計算されるのでしょうか。
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ第2部へ
小学生からエンジニアまでのRuby入門へ
本サイトトップへ