第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次元ループを初心者の方が理解できるよに、
粘り強く丁寧に説明していきたいと思います。
プログラミングを理解する上で大事なことは、変数の役割をきちんとつかむことです。
0 | 1 | 2 |
1 | 2 | 3 |
まず、a(0) 、a(1) 、a(2)の、0,1,2はセルの位置を示す番号だということです。
i,j,kは
0 | 1 | 2 |
i | j | k |
それぞれのセルの中身です。
変数のところで、箱のラベルと箱の内容をしっかり区別しないといけないと申し上げました。
ビール瓶に張ってあるラベルと中に入っているビールは区別しなければいけないのと同じです。
0,1,2はセルのラベルに相当し、i,j,kは箱の中身に相当します。
ですから、j=1のとき、おなじ1でも、
箱の中身(ビールに相当するもの)である1とセル番号である1(ビール瓶のラベルに相当するもの)
は明確に区別しないと訳がわからなくなります。
最後にlは、セル番号=セルのラベル0,1,2に対応しています。
i,j,kとセル番号0,1,2とlの役割を明確に理解することが理解の早道となります。
後のSubプロシージャの再帰的使用によるプログラムを理解する際にも、それらがキーとなります。
再帰的使用の方は、コードは簡単ですが、内容=概念は難しいと申し上げましたが、
i,j,kとセル番号0,1,2とl(再帰的使用版ではg)役割把握が困難であるからです。
しかし、逆に言うとそれらの役割を明確につかめばFor版はもちろんのこと再帰的使用版も簡単に理解することが出来ます。
解説、詳しいトレースは次話に続きます。
第1話へ 第3話へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る