第11講 Subプロシージャの再帰的使用の学習

第4話 Subプロシージャ版順列作成の解説その1

Private Sub CommandButton1_Click()
  n = Cells(2, 10)
  cn = 0
  f (0)
  Cells(3, 13) = cn
End Sub

Sub f(g As Integer)
  Dim i As Byte, j As Byte, h As Byte
  For i = 1 To n
    a(g) = i
    h = 1
    If g > 0 Then
      For j = 0 To g - 1
        If a(g) = a(j) Then
          h = 0
          Exit For
        End If
      Next
    End If
    If h = 1 Then
      If g + 1 < n Then
        f (g + 1)
      Else
        For j = 0 To n - 1
          Cells(5 + 2 * Int(cn / 10), 1 + (n + 1) * (cn Mod 10) + j) = a(j)
        Next
        cn = cn + 1
      End If
    End If
  Next
End Sub

n=3の場合で解説していきます。
くどいようですが、大事なことを繰り返します。
gはセル番号であり、対象にする空間(=世界=セル)の次元を示すのものです。
そして、次元(セル)が違えば、同じiでも次元と次元と次元は別物です。

は別次元の世界の住民です。

少しむずしい言い方をしてしましましたが、簡単に言い直すと、
0,1,2はセル(数字や文字を入れる箱)のラベル名(箱の名前)であり、
はそのラベルの貼ってあるセル(数字や文字を入れる箱)の内容です。
は、1,2,3と動き、現象的には0,1,2と似ていますが、
実際には、ビール瓶の例えでは0,1,2はビール瓶のラベルですし、
はビール瓶に入っているビールで、全然違うものです。
セル番号
とセルの中身を明確に区別されてコードを読んでください。

ライラの冒険では、主人公の女の子はあちらこちらの次元の世界を行ったり来たりしますが、
このプログラムも、いろいろな次元を行ったり来たりします。
今どの次元にいるのか、入れ子式人形例えでは、外側から何番目の人形のところにいるのかを明瞭・明確に理解していないと、
訳がわからなくなります。
比喩で、

と書いていますが、本当はループ版のときと違い、

1


2 3


3 1 2

と時に応じて様々な姿をしています。
プロシージャは、呼び出されたときだけメモリ上に存在しています。
プロシージャが活動を終えたとき、プロシージャはメモリ上から消滅します。
変数と同じで、プロシージャもメモリ上に存在していて、
メモリ上で生成消滅を繰り返すのです。
まず、Private Sub CommandButton1_Clickから、f (
0)で呼び出されて、はじめて世界

が生まれます。そして、f (0)からf (1)が呼び出されたとき、2番目の世界

が生誕します。そして、f (1)からf (2)が呼び出されて、3番目の世界

が発生します。f (2)が任務を遂行し終わると、f (2)は消滅して

となります。同様に、f (1)も処理を終えると、命も終わり

となります。さらに、f (0)が任務を遂行すると、すべて消えてしまします。
しかし、f (0)・f (1)・f (2)が消滅しても、生きていたときの活動結果がシートに残されるわけです。
つまり、f (0)・f (1)・f (2)はシートに順列をすべて表示させるという任務を終えると、消滅することが運命づけられているわけです。
順列の生成は、f (0)・f (1)・f (2)の連係プレイによるものですが、
シートに結果を表示させるという栄誉ある任務を遂行できるのは(最後の核ボタンを押す権限をもつのは)、f (2)だけです。
      If g + 1 < n Then
        f (g + 1)
      Else
        For j = 0 To n - 1
          Cells(5 + 2 * Int(cn / 10), 1 + (n + 1) * (cn Mod 10) + j) = a(j)
        Next
        cn = cn + 1
      End If
次話では具体的にトレースしていきます。



第3話へ 第5話へ

004
  


VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る