第9講 サブプロシージャの再帰的使用

第3話 自分が自分に仕事を頼むという謎の正体
プログラムコード再掲
Dim cn As Integer
Private Sub CommandButton1_Click()

  CommandButton2_Click
  cn = 0
  
f 'CommandButton1_Clickがサブプロシージャfに仕事を依頼
End Sub
Sub f()

  Cells(4 + cn, 1) = "今日は天気がよい"
  cn = cn + 1
  If cn = 11 Then Exit Sub
  
f 'fがfに仕事を依頼
  
End Sub

Private Sub CommandButton2_Click()
  
  Rows("4:20000").Select
  Selection.ClearContents
  Cells(1, 1).Select
  
End Sub
参考ダウンロード添付ファイル

確かに、fのサブプロシージャ内でfに仕事を依頼しています。
そうすると、自分が自分に仕事を依頼しているように見えます。
ですが、同じ自分でも実は次元が違うのです。
頼む自分と頼まれる自分は、次元の異なる自分です。
????
ですよね。

皆さん、入れ子式人形を知っていますよね。
七福神ですね。
不思議なことに日本にもロシアにもあります。
人形の中に人形が入っています。
頼む自分と頼まれる自分の関係は、
入れ子式人形の外側の人形と内側の人形の関係に相当します。
最初に、CommandButton1_Clickが
  f 'CommandButton1_Clickがサブプロシージャfに仕事を依頼
によってfに仕事を依頼しましたが、
これは入れ子式人形の1番外側の人形に仕事をお願いしたのです。
そして、fがfに仕事を頼んでいますが、
これは、1番外側の人形がその1個内側の人形に仕事を依頼したのです。
仕事の連鎖は次のようになっています。
CommandButton1_Clickが1番外側の人形に依頼
          ↓
1番外側の人形は、外側から2番目の人形に依頼
          ↓
外側から2番外側の人形は、外側から3番目の人形に依頼
          ↓
外側から3番外側の人形は、外側から4番目の人形に依頼
          ↓
          *
          *
          *
です。そして、これがどこまで続くかと申しますと、
  cn = cn + 1
  If cn = 11 Then Exit Sub
を見ればお分かりのように、
外側から9番外側の人形は、外側から10番目の人形に依頼
まで続くのです。
それぞれ人形が表示の仕事をするために
jh
と1回「今日は天気がよい」が表示されることになるのです。
入れ子式の人形は似た形をしていますが、
外側の人形と内側の人形では、異なる人形です。
それと同じように、頼む自分と頼まれる自分は似た姿をしていますが、
実は異なる人格です。
これが同じ自分でも次元が異なるということの意味です。

関数=プロシージャもメモリという舞台で役を演じます。
変数も関数もメモリ上に存在します。
関数は、呼び出されたときだけメモリ上に存在します。
仕事が終わればメモリ上から消えてなくなります。
関数は、生成と消滅を繰り返します。
CommandButton1_Clickがfを呼び出すと、
あるメモリ上でfは仕事をします。
ある番地をもったメモリ上に、fを展開します。
そして、1回目にfがfを呼び出すとき、
そのメモリとは異なるメモリ上にまたfが展開されます。
今回の例では、最終的には異なる10カ所のメモリ上に、
fが同時に展開されています。
そして、1番内側の人形が任務を終了すると、
10カ所から9カ所へ、
内側から2番目の人形が業務を終えると
9カ所から8カ所へ
の同時展開の数を減らしながら、
すべての仕事が終わり、
fのメモリ上への展開は終了します。
最大10人のfが異なるメモリ上(舞台の異なる位置)で踊っていましたが、
最後には、全員が舞台から降ります。
つまり、自分と似た存在10人が舞台で踊っていたのです。
入れ子式人形の比喩は、fの再帰的呼び出しを説明するのに、
ぴったりですが、
呼び出されない限り、人形は存在しないという点が異なっています。
CommandButton1_Clickがfを呼び出したときに1番外側の人形が発生し、
fがfを呼び出した時点で、内側の人形が発生します。
fがfを呼び出すときに、自分と同型の人形を内側に発生させるし、
任務の遂行が終われば人形は消滅するです。
入れ子式にfの展開個数は
0→1→2→3→4→5→6→7→8→9→10→9→・・・→1→0
という途を辿ります。

これで1個目の謎(自分が自分に仕事を頼む不思議)の正体は、fが自分の分身を作り出し、
自分の分身に仕事を依頼していたということです。
次元が違うといったのは、自分と自分の分身の違いです。
プロシージャの再帰的呼び出ししとは、結局分身の術なのです。

では、スタックが足りませんとはどういう意味でしょうか。



第2話へ 第4話へ

004

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入門へ
小学生からエンジニアまでのC言語入門 基礎から応用まで
本サイトトップへ