第10講 Subプロシージャの再帰的使用理解のための課題

第2話 3次元ループによる3次元順列の作成

Private Sub CommandButton1_Click()

  Dim a(2) As Integer
  Dim i As Integer, j As Integer, k As Integer, l As Integer, cn As Integer
  Dim h1 As Byte, h2 As Byte

  cn = 0
  For i = 1 To 3
    a(0) = i
    For j = 1 To 3
      a(1) = j
      h1 = 1
      If a(1) = a(0) Then h1 = 0
      If h1 = 1 Then
        For k = 1 To 3
          a(2) = k
          h2 = 1
          For l = 0 To 1
            If a(2) = a(l) Then
               h2 = 0
               Exit For
            End If
          Next
          If h2 = 1 Then
            For l = 0 To 2
              Cells(5 + 2 * Int(cn / 3), 1 + 4 * (cn Mod 3) + l) = a(l)
            Next
            cn = cn + 1
          End If
        Next
      End If
    Next
  Next

  Cells(5 + 2 * Int(cn / 3), 1) = "順列総数"
  Cells(5 + 2 * Int(cn / 3), 4) = cn

End Sub

最初の予定では、『高次元ループと高次元配列』『高次元配列と1次元配列』を学習してから、
Functionプロシージャの再帰的使用を学び、そして、Subプロシージャの再帰的使用をに入るつもりでした。
しかし、気が変わって変更したことが災いしています。
3次元ループを飛び越して、4次元ループが出てきてしまいました。
初心者にとっては、2次元ループでさえ、頭が爆発しそうなのにです。
やはり、予定通り進めるべきだったと後悔しています。

ですが、悩んでいても仕方がないので、
この難解な4次元ループを初心者の方が理解できるよに、
粘り強く丁寧に説明していきたいと思います。
プログラミングを理解する上で大事なことは、変数の役割をきちんとつかむことです。

 1 2  3 

まず、a(0) 、a(1) 、a(2)の、0,1,2はセルの位置を示す番号だということです。
i,j,kは

j 

それぞれのセルの中身です。
変数のところで、箱のラベルと箱の内容をしっかり区別しないといけないと申し上げました。
ビール瓶に張ってあるラベルと中に入っているビールは区別しなければいけないのと同じです。
0,1,2はセルのラベルに相当し、は箱の中身に相当します。
ですから、j=のとき、おなじ1でも、
箱の中身(ビールに相当するもの)であるとセル番号である(ビール瓶のラベルに相当するもの)
は明確に区別しないと訳がわからなくなります。
最後には、セル番号=セルのラベル0,1,2に対応しています。

とセル番号0,1,2の役割を明確に理解することが理解の早道となります。
後のSubプロシージャの再帰的使用によるプログラムを理解する際にも、それらがキーとなります。
再帰的使用の方は、コードは簡単ですが、内容=概念は難しいと申し上げましたが、
とセル番号0,1,2(再帰的使用版では)役割把握が困難であるからです。
しかし、逆に言うとそれらの役割を明確につかめばFor版はもちろんのこと再帰的使用版も簡単に理解することが出来ます。

解説、詳しいトレースは次話に続きます。


第1話へ 第3話へ

004


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

数学研究室に戻る