第10講 Subプロシージャの再帰的使用理解のための課題
第3話 ループ版の詳しいトレースその1
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
0 | 1 | 2 |
i | j | k |
では詳しくとレースしていきたいと思います。
T i=1のとき、セル番号0(この0はa(0)の0)の世界にいます。
0 | 1 | 2 |
1 | j | k |
そして、即座にセル番号1の世界に入ります。
@ j=1の場合
0 | 1 | 2 |
1 | 1 | k |
ここで、If a(1) = a(0) Then h1 = 0 から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によって
A j=2の場合とかわります。
0 | 1 | 2 |
1 | 2 | k |
今度は、If a(1) = a(0) Then h1 = 0をクリアして、h1は1のままで
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
が実行され、セル番号2の世界に入ります。
@ k=1なら
0 | 1 | 2 |
1 | 2 | 1 |
For l = 0 To 1
If a(2) = a(l) Then
h2 = 0
Exit For
End If
Next
の1回目のループにおいて a(2)=a(0)となってしまい、
h2=0となります。すると、
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によって
A k=2となり、
0 | 1 | 2 |
1 | 2 | 2 |
ですが、
For l = 0 To 1
If a(2) = a(l) Then
h2 = 0
Exit For
End If
Next
の2回目のループとき、 a(2)=a(1)
となってしまうので、再び
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によって
B k=3となり、
0 | 1 | 2 |
1 | 2 | 3 |
となりまして、
For l = 0 To 1
If a(2) = a(l) Then
h2 = 0
Exit For
End If
Next
のループを2回ともクリアして、h2は1のままで初めて、
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
が実行されます。
For l = 0 To 2
Cells(5 + 2 * Int(cn / 3), 1 + 4 * (cn Mod 3) + l) = a(l)
Next
によって、1個目の順列がシートに表示され、
となり、さらに、cn = cn + 1から順列総数のカウンタcnがカウントされ1になります。
本日のトレースはここまで。
第2話へ 第4話へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る