第9講 プロシージャの再帰的使用
第5話 for文版順列作成の解説その2
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
'変数の宣言と初期化
Dim h1, h2, s As Integer
Dim a(12) As Integer
s = 0
'データグリッドビューのデータのクリア
DataGridView1.Rows.Clear()
'順列の作成
For i = 1 To 3 '1番最初のセル
a(0) = i
For j = 1 To 3 '2番目のセル
a(1) = j
h1 = 1
If a(0) = a(1) Then h1 = 0 '1番目のセルと2番目のセルの重複検査
If h1 = 1 Then
For k = 1 To 3 '3番目のセル
a(2) = k
h2 = 1
For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
If a(l) = a(2) Then
h2 = 0
Exit For
End If
Next
If h2 = 1 Then 'DataGridViewへの表示と総数カウント
DataGridView1.Rows.Add() '1行追加
For l = 0 To 2
DataGridView1(l, s).Value = a(l).ToString '順列の表示
Next
s = s + 1 '総数カウント
End If
Next
End If
Next
Next
DataGridView1.Rows.Add() '1行追加
DataGridView1(12, s + 1).Value() = s '総数の表示
End Sub
End Class
セルの内容 | 1 | 2 | 3 |
セル番号 | 0 | 1 | 2 |
1個の目の順列の完成ともに3次元目のループが終了します。そして、
2次元目の3巡目のループで
セルの内容 | 1 | 3 | 1 |
セル番号 | 0 | 1 | 2 |
h1 = 1
If a(0) = a(1) Then h1 = 0 '1番目のセルと2番目のセルの重複検査
においては、1と3が比較されますが、もちろん異なっているのでIf文は実行されず、
3次元ループが再び再開されます。
セルの内容 | 1 | 3 | 1 |
セル番号 | 0 | 1 | 2 |
h2 = 1
For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
If a(l) = a(2) Then
h2 = 0
Exit For
End If
Next
の1巡目において、1と1が比較されh2は0とされ強制終了されて、
2回目の3次元目ループの2巡目が実施され
セルの内容 | 1 | 3 | 2 |
セル番号 | 0 | 1 | 2 |
h2 = 1
For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
If a(l) = a(2) Then
h2 = 0
Exit For
End If
Next
のおいて、1巡目は1と2、2巡目は3と2の比較がされますが、いずれも内容が違いIf文はスルーされてh2は1のままで、
セルの内容 | 1 | 3 | 2 |
セル番号 | 0 | 1 | 2 |
If h2 = 1 Then 'DataGridViewへの表示と総数カウント
DataGridView1.Rows.Add() '1行追加
For l = 0 To 2
DataGridView1(l, s).Value = a(l).ToString '順列の表示
Next
s = s + 1 '総数カウント
End If
が実施され、2個目の順列がデータグリッドビューに表示され、s = s + 1 によって順列総数も2になります。
2回目の3次元目ループも最後の3巡目になり、
セルの内容 | 1 | 3 | 3 |
セル番号 | 0 | 1 | 2 |
となりますが、
For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
If a(l) = a(2) Then
h2 = 0
Exit For
End If
Next
の2巡目において、3と3が比較されh2は0になってしまいます。
したがって、
If h2 = 1 Then 'DataGridViewへの表示と総数カウント
DataGridView1.Rows.Add() '1行追加
For l = 0 To 2
DataGridView1(l, s).Value = a(l).ToString '順列の表示
Next
s = s + 1 '総数カウント
End If
はスルーされて、2回目の3次元ループが終了します。
1回目の2次元ループも終了しますので、
1次元ループの2巡目になり、
セルの内容 | 2 | 3 | 3 |
セル番号 | 0 | 1 | 2 |
そして、すぐに2回目の2次元目ループに入り、1巡目から
セルの内容 | 2 | 1 | 3 |
セル番号 | 0 | 1 | 2 |
これは、
h1 = 1
If a(0) = a(1) Then h1 = 0 '1番目のセルと2番目のセルの重複検査
をクリアして、3回目の3次元目ループが始まり、
セルの内容 | 2 | 1 | 1 |
セル番号 | 0 | 1 | 2 |
For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
If a(l) = a(2) Then
h2 = 0
Exit For
End If
Next
クリアせず、3回目の3次元ループの2巡目に入り、
セルの内容 | 2 | 1 | 2 |
セル番号 | 0 | 1 | 2 |
となりますが、これも
For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
If a(l) = a(2) Then
h2 = 0
Exit For
End If
Next
をクリアせず、3回目の3次元目ループの3巡目になり、
セルの内容 | 2 | 1 | 3 |
セル番号 | 0 | 1 | 2 |
今回は
For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
If a(l) = a(2) Then
h2 = 0
Exit For
End If
Next
をクリアして、
If h2 = 1 Then 'DataGridViewへの表示と総数カウント
DataGridView1.Rows.Add() '1行追加
For l = 0 To 2
DataGridView1(l, s).Value = a(l).ToString '順列の表示
Next
s = s + 1 '総数カウント
End If
が実施され、3個目の順列がデータグリッドビューに表示され、順列総数も3とカウントされます。
これで3回目の3次元目ループが終了し、
2回目の2次元目ループの2巡目となり、
セルの内容 | 2 | 2 | 3 |
セル番号 | 0 | 1 | 2 |
h1 = 1
If a(0) = a(1) Then h1 = 0 '1番目のセルと2番目のセルの重複検査
をクリアせず、すぐに2回目の2次元目ループは3巡目となり
セルの内容 | 2 | 3 | 3 |
セル番号 | 0 | 1 | 2 |
h1 = 1
If a(0) = a(1) Then h1 = 0 '1番目のセルと2番目のセルの重複検査
をクリアして、4回目の3時限目ループが始まり、
セルの内容 | 2 | 3 | 1 |
セル番号 | 0 | 1 | 2 |
いきなり、
For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
If a(l) = a(2) Then
h2 = 0
Exit For
End If
Next
をクリアして、
If h2 = 1 Then 'DataGridViewへの表示と総数カウント
DataGridView1.Rows.Add() '1行追加
For l = 0 To 2
DataGridView1(l, s).Value = a(l).ToString '順列の表示
Next
s = s + 1 '総数カウント
End If
が実施され、4個目の順列がデータグリッドビューに表示され、順列総数も4を数えることになります。
2巡目、3巡目はそれぞれ
セルの内容 | 2 | 3 | 2 |
セル番号 | 0 | 1 | 2 |
セルの内容 | 2 | 3 | 3 |
セル番号 | 0 | 1 | 2 |
ですが、いずれも
For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
If a(l) = a(2) Then
h2 = 0
Exit For
End If
Next
をクリアできず、4回目の3次元目ループが終了し、続いて2回目の2次元目ループも終了します。
そして、1次元目ループの3巡目になり、
セルの内容 | 3 | 3 | 2 |
セル番号 | 0 | 1 | 2 |
すぐに、3回目の2次元目ループが始まり、
セルの内容 | 3 | 1 | 2 |
セル番号 | 0 | 1 | 2 |
h1 = 1
If a(0) = a(1) Then h1 = 0 '1番目のセルと2番目のセルの重複検査
をクリアして、5回目の3次元ループが実行され、
セルの内容 | 3 | 1 | 1 |
セル番号 | 0 | 1 | 2 |
セルの内容 | 3 | 1 | 2 |
セル番号 | 0 | 1 | 2 |
2巡目において
For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
If a(l) = a(2) Then
h2 = 0
Exit For
End If
Next
をクリアして、
If h2 = 1 Then 'DataGridViewへの表示と総数カウント
DataGridView1.Rows.Add() '1行追加
For l = 0 To 2
DataGridView1(l, s).Value = a(l).ToString '順列の表示
Next
s = s + 1 '総数カウント
End If
が実施され、5個目の順列がデータグリッドビューに表示され、順列総数5とになります。
次に、
セルの内容 | 3 | 2 | 1 |
セル番号 | 0 | 1 | 2 |
For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
If a(l) = a(2) Then
h2 = 0
Exit For
End If
Next
をクリアして、
If h2 = 1 Then 'DataGridViewへの表示と総数カウント
DataGridView1.Rows.Add() '1行追加
For l = 0 To 2
DataGridView1(l, s).Value = a(l).ToString '順列の表示
Next
s = s + 1 '総数カウント
End If
が実施され、6個目の順列がデータグリッドビューに表示され、順列総数6とになります。
以下は、
セルの内容 | 3 | 2 | 2 |
セル番号 | 0 | 1 | 2 |
セルの内容 | 3 | 2 | 3 |
セル番号 | 0 | 1 | 2 |
はいずれも条件
For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
If a(l) = a(2) Then
h2 = 0
Exit For
End If
Next
をクリアせず、3次元ループのすべてが終了します。続いて
セルの内容 | 3 | 3 | 2 |
セル番号 | 0 | 1 | 2 |
はいずれも条件
h1 = 1
If a(0) = a(1) Then h1 = 0 '1番目のセルと2番目のセルの重複検査
をクリアせず、3次元ループのすべてが終了します。
以上トレースから確かにプログラムは、3次順列を生成してくれることが、確認できました。
次話では、いよいろ自己再帰型プログラムに挑戦します。
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
数学研究室に戻る