第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話へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る