第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のとき、

1 2 3

1個目の順列が出来た段階で、3個目のループは終わりになり、2個目のループのNextにより、

  A j=3の場合となります。

1 3

   今度も、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
   が実行され、セル番号の世界に入ります。
      @ k=1なら

1 3 1

          For l = 0 To 1
            If a(2) = a(l) Then
               h2 = 0
               Exit For
            End If
          Next        
          の1回目のループにおいて a()=a()となってしまい、  
          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となり、

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個目の順列2個目の順列が表示されます。
          そして、cn = cn + 1

       B k=3となり、

1 3 3

         となりまして、
          For l = 0 To 1
            If a(2) = a(l) Then
               h2 = 0
               Exit For
            End If
          Next   
          の2回目のループでa()=a()となり、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の場合となります。

2 j 

すぐに、2回目の2巡目のループになり
 @ j=1となります。 

2 1

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

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

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となり

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つめの順列3個目の順列が表示され、cnも3となります。
            

本日のトレースはここまで。本当に長いトレースになりますが、忍耐のしどころですよ。
がんばりましょう。



第3話へ 第5話へ

004  


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

数学研究室に戻る