第10講 Subプロシージャの再帰的使用理解のための課題

第3話 ループ版の詳しいトレースその1

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

j 

では詳しくとレースしていきたいと思います。
T i=1のとき、セル番号(この0はa(0)の0)の世界にいます。

1 j 

そして、即座にセル番号の世界に入ります。
 @ j=1の場合

1 1

   ここで、If a(1) = a(0) Then h1 = 0 から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によって
 A j=2の場合とかわります。

1 2

   今度は、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 2 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 2 2

         ですが、
          For l = 0 To 1
            If a(2) = a(l) Then
               h2 = 0
               Exit For
            End If
          Next   
          の2回目のループとき、 a()=a(
          となってしまうので、再び
          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によって   
       B k=3となり、

1 2 3

          となりまして、
          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
          によって、1個目の順列がシートに表示され、
          順列1個目の表示
となり、さらに、cn = cn + 1から順列総数のカウンタcnがカウントされ1になります。

本日のトレースはここまで。



第2話へ 第4話へ

004  


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

数学研究室に戻る