第11講 プロシージャの再帰的使用によって順列を生成する
第5話 普遍的な順列生成プログラム解説その3

入門
コード再掲
Dim x(15) As Byte, cn As Long, n As Byte
Private Sub CommandButton1_Click()
  n = Cells(3, 11)
  cn = 0
  f (
0)
End Sub
Sub f(g As Byte)
  Dim h As Byte, i As Byte, j As Byte, a As Byte, s As Long
  a = cn Mod 10
  s = Int(cn / 10)
  For
i = 1 To n
    x(g) = i
    h = 1
    If g > 0 Then
      For j = 0 To g - 1
        If x(j) = x(g) 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 * s, 2 + (n + 1) * a + j) = x(j)
        Next
        cn = cn + 1
      End If
    End If
  Next
End Sub


解説


 0
1 2 3

1個目の順列の作成表示に成功すると、f (2)は寿命を終えて、消滅し


 0
1 2

となります。f (1)のNextによって、


 0
1 3

となります。x(1)≠x(0)なので、チェック
    h = 1
    If g > 0 Then
      For j = 0 To g - 1
        If x(j) = x(g) 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 * s, 2 + (n + 1) * a + j) = x(j)
        Next
        cn = cn + 1
      End If
    End If
が行われます。g=1ですから、g + 1 < n  は 1 + 1 < 3
で成り立ち、
        f (g + 1)
が呼び出され、セル番号2の世界の2回目の生誕となります。


 0
1 3

  For i = 1 To n
    x(g) = i
によって、


 0
1 3 1

となります。残念ながら、x(2) = x(0) ですから
      For j = 0 To g - 1
        If x(j) = x(g) Then
          h = 0
          Exit For
        End If
      Next
の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 * s, 2 + (n + 1) * a + j) = x(j)
        Next
        cn = cn + 1
      End If
    End If
実施されず、f (2)のNextにより、

 0
1 3 2

となります。x(2)≠x(0)、x(2)≠x(1)なので、
    h = 1
    If g > 0 Then
      For j = 0 To g - 1
        If x(j) = x(g) 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 * s, 2 + (n + 1) * a + j) = x(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 * s, 2 + (n + 1) * a + j) = x(j)
        Next
        cn = cn + 1
      End If
が実行され、2個目の順列vba
が表示されることになります。
そして、Nextによって


 0
1 3 3

となりますが、x(2) = x(1)で
    h = 1
    If g > 0 Then
      For j = 0 To g - 1
        If x(j) = x(g) 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 * s, 2 + (n + 1) * a + j) = x(j)
        Next
        cn = cn + 1
      End If
    End If
無視され、
f (
2)のすべての処理が終わり、
2回目のf (
2)の消滅となります。


 0
1 3

そして、f (1)も任務が終了して、消滅します。


 0
1

そして、Nextによって、


 0
2

となりますが、g=0なので、
    h = 1
    If g > 0 Then
      For j = 0 To g - 1
        If x(j) = x(g) Then
          h = 0
          Exit For
        End If
      Next
    End If
は無視されて、
      If g + 1 < n Then
        f (g + 1)
      Else
        For j = 0 To n - 1
          Cells(5 + 2 * s, 2 + (n + 1) * a + j) = x(j)
        Next
        cn = cn + 1
      End If
の肯定の方が実施され、セル番号1の世界の2回目の誕生となります。


 0
2

となります。
  For i = 1 To n
    x(g) = i
によって、


 0
2 1

となります。x(1)≠x(0)で、チェック
    h = 1
    If g > 0 Then
      For j = 0 To g - 1
        If x(j) = x(g) Then
          h = 0
          Exit For
        End If
      Next
    End If
をクリアして、
      If g + 1 < n Then
        f (g + 1)
      Else
        For j = 0 To n - 1
          Cells(5 + 2 * s, 2 + (n + 1) * a + j) = x(j)
        Next
        cn = cn + 1
      End If
の肯定の側が遂行され、セル番号2の世界の3回目の生成となります。


 0
2 1

  For i = 1 To n
    x(g) = i
によって、


 0
2 1 1

となります。 x(2) = x(1)
ですので
    h = 1
    If g > 0 Then
      For j = 0 To g - 1
        If x(j) = x(g) 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 * s, 2 + (n + 1) * a + j) = x(j)
        Next
        cn = cn + 1
      End If
    End If
は実施されず、Nextによって


 0
2 1 2

今度は、 x(2) = x(0)で
    h = 1
    If g > 0 Then
      For j = 0 To g - 1
        If x(j) = x(g) 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 * s, 2 + (n + 1) * a + j) = x(j)
        Next
        cn = cn + 1
      End If
    End If
は実行されず、Nextによって


 0
2 1 3

x(2)≠x(0)、x(2)≠x(1)なので3度目の正直で
    h = 1
    If g > 0 Then
      For j = 0 To g - 1
        If x(j) = x(g) Then
          h = 0
          Exit For
        End If
      Next
    End If
のチェックをクリアして
      Else
        For j = 0 To n - 1
          Cells(5 + 2 * s, 2 + (n + 1) * a + j) = x(j)
        Next
        cn = cn + 1
      End If
の命令が行われ、3個目の順列入門
が表示されます。

本日のトレースはここまで。これ以降のトレースは次話で。




第4話へ 第6話へ



トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ