第10講 プロシージャの再帰的使用
第2話 プロシージャの再帰的使用は入れ子式人形

数独
プログラム再掲
Private Sub CommandButton1_Click()
  f (0)
End Sub
Sub f(n As Byte)
  Cells(5 + n, 2) = "はじめてのプロシージャの再帰的使用。"
  If n < 10 Then f (n + 1)
End Sub

こちらのコードの方がわかりやすいのは、
同じfといっても実際には、
f(0),f(1),f(2),f(3),f(4),f(5),f(6),f(7),f(8),f(9)
ですから、同じfでありながら、異なるfです。
同じ自分でありながら異なる自分です。

自分自身を振り返ってみてください。
家庭にいるパパ(ママ)としての自分、会社で部長としての自分、
地域の役員としての自分、バーにいるときの自分など、
同じ自分でありながら違う自分です。
人によっては多重人格のように場面によって、
まったく異なっている人もします。
家では暴君なのに、会社では片隅でおとなしくしていたりします。
会社では社長としてスーツでびっしっと決めていて部下から尊敬されていても、
家ではステテコでいて娘から蔑まれていたりします。
どんな人でも役割を演じているのです。
私たちは、ペルソナ(仮面)をかぶって生きています。
同じ自分が異なる自分になるのです。

上の比喩より、プロシージャの再帰的使用とは、
入れ子式人形であるといった方がわかりやすいでしょう。
f(0),f(1),f(2),f(3),f(4),f(5),f(6),f(7),f(8),f(9)は、
10個の人形が入れ子に入っています。
f(0)が一番外側の人形で、
f(1)が外から2番目の人形、
f(2)が外から3番目の人形、
      ・
      ・
      ・
という訳でf(9)は入れ子式人形の1番内側の人形です。
同じ自分でも実は次元の異なる自分です。
次元が異なるというのは、人形が異なっているということです。
つまり、今回のコード
Private Sub CommandButton1_Click()
  f (0)
End Sub
Sub f(n As Byte)
  Cells(5 + n, 2) = "はじめてのプロシージャの再帰的使用。"
  If n < 10 Then f (n + 1)
End Sub
は最初SubプロシージャCommandButton1_Clickが1番外側の人形
f(0)に仕事を依頼します。
次に、f(0)は表示するという仕事をしてから自分より1つ内側の人形f(1)に仕事を依頼します。
さらに、f(1)は表示するという仕事をしてから自分より1つ内側の人形f(2)に仕事を依頼します。

      ・
      ・
      ・
最後に、内側から2番目の人形f(8)が表示するという仕事をしてから、
最も内側の人形f(9)に仕事を依頼します。
1番内側の人形は表示の仕事をしますが、
  
If n < 10 Then f (n + 1)
If n < 10から自分が1番内側の人形であることを認識していますから、
仕事は誰にも依頼しません。

そうするとf(9)の仕事は終わり、
今度は逆の旅路をたどることになります。
f(9)からf(8)に戻り、
f(8)からf(7)に戻り、
f(7)からf(6)に戻り、
     ・
     ・
     ・

f(1)からf(0)に戻り、
最後には、f(0)から最初に仕事を依頼した
SubプロシージャCommandButton1_Clickへと帰還して
プログラムが終了となるのです。
もう一度流れを図にすると
CommandButton1_Click→f(0)→f(1)→f(2)→f(3)→
f(4)→f(5)→f(6)→f(7)→f(8)→f(9)→f(8)→f(7)→
f(6)→f(5)→f(4)→f(3)→f(2)→f(1)→f(0)→CommandButton1_Click
という訳です。

CommandButton1_Clickから1番外側の人形f(0)へ、
次に外側から2番目の人形f(1)へ、
外側から3番目の人形f(2)へ、
      ・
      ・
      ・
1番内側の人形f(9)へと自分の内側への遡及を続け、
それが終わると外側への還帰という逆遡及をしていきます。

再帰的使用は入れ子式人形であるという比喩の意味がお分かりでしょうか。
最後にもうひとつ例えをしましょう。
再帰的使用は分身の術だと。
たった1人なのに10人分の仕事をしている。
分身の術を使い10人に分身して仕事をしたのです。
もちろん、
  If n < 10 Then f (n + 1)
If n < 10
1020に変えるなら、20人に分身します。
魔方陣自動生成・数独自動生成プログラムでは、
分身の術を使い10000人にも分身したりします。
1人が1万人でも1億人にも分身できる・・・
魔法のような方法が、再帰的使用なのです。

この分身の術を使えば、
1から10までの和をFor文を使わないで実現することができます。
  w = w + 1
  w = w + 2
  w = w + 3
  w = w + 4
  w = w + 5
  w = w + 6
  w = w + 7
  w = w + 8
  w = w + 9
  w = w + 10
のそれぞれの部分を分身した自分に仕事をしてもらえば良い訳です。
2つののコード
Private Sub CommandButton1_Click()
  f (0)
End Sub
Sub f(n As Byte)
  Cells(5 + n, 2) = "はじめてのプロシージャの再帰的使用。"
  If n < 10 Then f (n + 1)
End Sub

Dim n As Byte
Private Sub CommandButton1_Click()
  n = 0
  f
End Sub
Sub f()
  Cells(5 + n, 2) = "はじめてのプロシージャの再帰的使用。"
  n = n + 1
  If n < 10 Then f
End Sub

を参考に皆さん考えてみてください。
数独
Functionプロシージャでもできますが、
今回はSubプロシージャで実現して頂きます。
グローバル変数
Dim w As Byte
を冒頭で宣言しておくと良いかも知れません。
また、Subプロシージャですので、
表示はSubプロシージャ側で行ってください。



第1話へ 第3話へ



トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ