第9講 プロシージャの再帰的使用
第6話 3次順列をプロシージャの再帰的使用を使わずにFor文で実現する
3次順列生成プログラム
Module Module1
Sub Main() '私は社長だ。
f (3)
End Sub
Sub f(n As Integer)
Dim i, j, k, l, h, hh, x(24), cn As Integer '将来5次魔方陣まで生成できるように!
cn = 0
For i = 0 To n - 1
x(0) = i + 1
For j = 0 To n - 1
h = 1
If j + 1 = x(0) Then h = 0
If h = 1 Then
x(1) = j + 1
For k = 0 To n - 1
hh = 1
For l = 0 To n - 2
If x(l) = k + 1 Then
hh = 0
Exit For
End If
Next
If hh = 1 Then x(2) = k + 1
If hh = 1 Then
cn += 1
For l = 0 To n - 1
Console.Write("{0:d} ", x(l))
Next
Console.WriteLine()
End If
Next
End If
Next
Next
Console.WriteLine("生成された{0:d}次順列は{1:d}個です。", n, cn)
End Sub
End Module
実行画面
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
生成された3次順列は6個です。
For文で作る順列生成ソフトは、4次を最後とします。
これを作っていただいている理由は、
プロシージャの再帰的使用がいかに便利なものであるかを体感してもらためです。
For文だといちいちコードを作り直さなければなりませんが、
プロシージャの再帰的使用だとコードが短いだけでなく、
汎用的なプログラムになります。
つまり、理論的には何次順列でも生成できるソフトになります。