第10講 Subプロシージャの再帰的使用理解のための課題
第4話 ループ版の詳しいトレースその2
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
T i=1のとき、
0 | 1 | 2 |
1 | 2 | 3 |
1個目の順列が出来た段階で、3個目のループは終わりになり、2個目のループのNextにより、
A j=3の場合となります。
0 | 1 | 2 |
1 | 3 | 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
が実行され、セル番号3の世界に入ります。
@ k=1なら
0 | 1 | 2 |
1 | 3 | 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 | 3 | 2 |
となり、
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
から、2個目の順列が表示されます。
そして、cn = cn + 1
B k=3となり、
0 | 1 | 2 |
1 | 3 | 3 |
となりまして、
For l = 0 To 1
If a(2) = a(l) Then
h2 = 0
Exit For
End If
Next
の2回目のループでa(2)=a(1)となり、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
は実行されません。
これで、3巡目(セル番号2の世界)のループが終了となり、即座に2巡目(セル番号1の世界)のループも終了となります。
そして、1巡目のループのNextにより、
U i=2の場合となります。
0 | 1 | 2 |
2 | j | k |
すぐに、2回目の2巡目のループになり
@ j=1となります。
0 | 1 | 2 |
2 | 1 | k |
h1 = 1
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回目の3巡目のループとなり
@ k=1となります。
0 | 1 | 2 |
2 | 1 | 1 |
これは
h2 = 1
For l = 0 To 1
If a(2) = a(l) Then
h2 = 0
Exit For
End If
Next
の2回目のループにおいて、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
が実行されず、3巡目のループのNextにより
A k=2となります。
0 | 1 | 2 |
2 | 1 | 2 |
今度は
h2 = 1
For l = 0 To 1
If a(2) = a(l) Then
h2 = 0
Exit For
End If
Next
の1回目のループにおいて、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
が実行されず、3巡目のループのNextにより
B k=3となり
0 | 1 | 2 |
2 | 1 | 3 |
となりますが、3度目の正直で
h2 = 1
For l = 0 To 1
If a(2) = a(l) Then
h2 = 0
Exit For
End If
Next
2回とも無事クリアして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
が実行され、 3つめの順列が表示され、cnも3となります。
本日のトレースはここまで。本当に長いトレースになりますが、忍耐のしどころですよ。
がんばりましょう。
第3話へ 第5話へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る