第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個の目の順列の完成ともに3次元目のループが終了します。そして、
  2次元目の3巡目のループで

セルの内容 
セル番号 

         h1 = 1
         If a(0) = a(1) Then h1 = 0  '1番目のセルと2番目のセルの重複検査
  においては、が比較されますが、もちろん異なっているのでIf文は実行されず、
  3次元ループが再び再開されます。

セルの内容 
セル番号 

             h2 = 1
             For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
               If a(l) = a(2) Then
                 h2 = 0
                 Exit For
               End If
             Next
  の1巡目において、が比較されh2は0とされ強制終了されて、
  2回目の3次元目ループの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巡目は、2巡目はの比較がされますが、いずれも内容が違いIf文はスルーされてh2は1のままで、

セルの内容 
セル番号 

             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巡目になり、

セルの内容 
セル番号 

  となりますが、
             For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
               If a(l) = a(2) Then
                 h2 = 0
                 Exit For
               End If
             Next
  の2巡目において、が比較され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回目の2次元目ループに入り、1巡目から

セルの内容 
セル番号 

  これは、
         h1 = 1
         If a(0) = a(1) Then h1 = 0  '1番目のセルと2番目のセルの重複検査
  をクリアして、3回目の3次元目ループが始まり、

セルの内容 
セル番号 

             For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
               If a(l) = a(2) Then
                 h2 = 0
                 Exit For
               End If
             Next
  クリアせず、3回目の3次元ループの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巡目になり、

セルの内容 
セル番号 

 今回は
             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巡目となり、

セルの内容 
セル番号 

         h1 = 1
         If a(0) = a(1) Then h1 = 0  '1番目のセルと2番目のセルの重複検査
  をクリアせず、すぐに2回目の2次元目ループは3巡目となり

セルの内容 
セル番号 

         h1 = 1
         If a(0) = a(1) Then h1 = 0  '1番目のセルと2番目のセルの重複検査
  をクリアして、4回目の3時限目ループが始まり、

セルの内容 
セル番号 

 いきなり、
             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巡目はそれぞれ

セルの内容 
セル番号 


セルの内容 
セル番号 

  ですが、いずれも
             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回目の2次元目ループが始まり、

セルの内容 
セル番号 

         h1 = 1
         If a(0) = a(1) Then h1 = 0  '1番目のセルと2番目のセルの重複検査
  をクリアして、5回目の3次元ループが実行され、

セルの内容 
セル番号 


セルの内容 
セル番号 

  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とになります。
  次に、

セルの内容 
セル番号 

             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とになります。
  以下は、

セルの内容 
セル番号 


セルの内容 
セル番号 

  はいずれも条件
             For l = 0 To 1 '3番目のセルと1,2番目のセルの重複検査
               If a(l) = a(2) Then
                 h2 = 0
                 Exit For
               End If
             Next
  をクリアせず、3次元ループのすべてが終了します。続いて

セルの内容 
セル番号 

  はいずれも条件
         h1 = 1
         If a(0) = a(1) Then h1 = 0  '1番目のセルと2番目のセルの重複検査
  をクリアせず、3次元ループのすべてが終了します。

  以上トレースから確かにプログラムは、3次順列を生成してくれることが、確認できました。


  次話では、いよいろ自己再帰型プログラムに挑戦します。




第4話へ 第6話へ

006

VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座

数学研究室に戻る