第11講 Subプロシージャの再帰的使用の学習
第6話 Subプロシージャ版順列作成の解説その3
Dim a(15) As Byte
Dim cn As Long
Dim n As Byte
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
0 | 1 | 2 |
1 | 2 | 3 |
1個目の順列の作成表示に成功すると、f (2)は寿命を終えて、消滅し
0 | 1 |
1 | 2 |
となります。f (1)のNextによって、
0 | 1 |
1 | 3 |
となります。a(1)≠a(0)なので、チェック
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
が行われます。g=1ですから、g + 1 < n は 1 + 1 < 3
で成り立ち、
f (g + 1)
が呼び出され、セル番号2の世界の2回目の生誕となります。
0 | 1 | 2 |
1 | 3 | i |
For i = 1 To n
a(g) = i
によって、
0 | 1 | 2 |
1 | 3 | 1 |
となります。残念ながら、a(2) = a(0) ですから
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
の1回目のループにおいてh=0と書き換えられ、
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
実施されず、f (2)のNextにより、
0 | 1 | 2 |
1 | 3 | 2 |
となります。a(2)≠a(0)、a(2)≠a(1)なので、
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
において2回ともhは書き換えられず、
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
の実行となりますが、g=2ですから g + 1 < n は 2 + 1 < 3 で成り立ちませんので
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
が実行され、2個目の順列が表示されることになります。
そして、Nextによって
0 | 1 | 2 |
1 | 3 | 3 |
となりますが、a(2) = a(1)で
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
のj=1のとき、h=0と書き換えられ、
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
f (2)のすべての処理が終わり、2回目のf (2)の消滅となります。
0 | 1 |
1 | 3 |
そして、f (1)も任務が終了して、消滅します。
0 |
1 |
そして、Nextによって、
0 |
2 |
となりますが、g=0なので、
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
の肯定の方が実施され、セル番号1の世界の2回目の誕生となります。
0 | 1 |
2 | i |
となります。
For i = 1 To n
a(g) = i
によって、
0 | 1 |
2 | 1 |
となります。a(1)≠a(0)で、チェック
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
の肯定の側が遂行され、セル番号2の世界の3回目の生成となります。
0 | 1 | 2 |
2 | 1 | i |
For i = 1 To n
a(g) = i
によって、
0 | 1 | 2 |
2 | 1 | 1 |
となります。 a(2) = a(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
2回目でh=0に書き換えられ、
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によって
0 | 1 | 2 |
2 | 1 | 2 |
今度は、 a(2) = a(0)で
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
1回目でh=0に書き換えられ、
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によって
0 | 1 | 2 |
2 | 1 | 3 |
a(2)≠a(0)、a(2)≠a(1)なので3度目の正直で
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
のチェックをクリアして
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話へ 第7話へ
VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る