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

第6話 8次順列ループ版 


解答例

Private Sub CommandButton1_Click()

  Dim a(7) As Integer
  Dim i As Integer, j As Integer, k As Integer, l As Integer, m As Integer, n As Integer, o As Integer, p As Integer, q As Integer, cn As Long
  Dim h1 As Byte, h2 As Byte, h3 As Byte, h4 As Byte, h5 As Byte, h6 As Byte, h7 As Byte, h8 As Byte

  cn = 0
  For i = 1 To 8
    a(0) = i
    For j = 1 To 8
      a(1) = j
      h1 = 1
      If a(1) = a(0) Then h1 = 0
      If h1 = 1 Then
        For k = 1 To 8
          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 = 1 To 8
              a(3) = l
              h3 = 1
              For m = 0 To 2
                If a(3) = a(m) Then
                  h3 = 0
                  Exit For
                End If
              Next
              If h3 = 1 Then
                For m = 1 To 8
                  a(4) = m
                  h4 = 1
                  For n = 0 To 3
                    If a(4) = a(n) Then
                      h4 = 0
                      Exit For
                    End If
                  Next
                  If h4 = 1 Then
                     For n = 1 To 8
                       a(5) = n
                       h5 = 1
                       For o = 0 To 4
                         If a(5) = a(o) Then
                           h5 = 0
                           Exit For
                         End If
                       Next
                       If h5 = 1 Then
                         For o = 1 To 8
                           a(6) = o
                           h6 = 1
                           For p = 0 To 5
                             If a(6) = a(p) Then
                               h6 = 0
                               Exit For
                             End If
                           Next
                           If h6 = 1 Then
                             For p = 1 To 8
                               a(7) = p
                               h7 = 1
                               For q = 0 To 6
                                 If a(7) = a(q) Then
                                   h7 = 0
                                   Exit For
                                 End If
                               Next
                               If h7 = 1 Then
                                 For q = 0 To 7
                                    Cells(5 + 2 * Int(cn / 10), 1 + 9 * (cn Mod 10) + q) = a(q)
                                 Next
                                 cn = cn + 1
                               End If
                             Next
                           End If
                        Next
                      End If
                    Next
                  End If
                Next
              End If
            Next
          End If
        Next
      End If
    Next
  Next

  Cells(2, 14) = "順列総数"
  Cells(2, 18) = cn

End Sub

実行画面例
実行例

どうです。とても大変ですね。うんざりですね。
ループ版の欠点は、次元が変わる度にコードを書き直さなければなりません。
しかも、同じようなコードの繰り返しです。
繰り返しは、人間がやるべき事ではありません。
コンピュータにやらせるべきです。
実は、Subプロシージャの再帰的使用を使えば短いコードで普遍性のあるプログラムを組むことが出来ます。
理論的には、100次順列でも1000次順列でも可能です。
ただ、今回の8次でさえすべて計算が終わるまでかなりの時間がかかりました。
待てる時間が10分程度なら12次あたりが限界ですが。

次講ではいよいよSubプロシージャの再帰的使用によって、プログラムを組みます。



第5話へ 第11講第1話へ

004  


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

数学研究室に戻る