順列生成(挿入法)問題(4)の考察1を示します。
問題(4)の考察1


' << INS401.bas >>
' 問題(4)の考察1に基づく順列生成プログラム。
' Tiny Basic
'
Public A(10) ' 順列を保存する配列。
Public B(10) ' 深さKの節点が生成される順序。
Public N ' 要素数。
Public COUNT ' 生成された順列の個数。
'
Do
' Nの読み込み。
Read N
If (N <= 0) Or (N > 9) Then Exit Do
Data 1,2,3,4, 0
'
' 初期設定。
A(1)=1
COUNT=0
For I=0 To N: B(I)=0: Next I
'
' 順列生成。
Call Perm(0)
'
' 結果の表示。
Print Using"N=## COUNT=######";N;COUNT
Loop
End
'
' 順列を生成する再帰手続き。
' Kは木の深さを表す。
Sub Perm(K)
' 生成された順列の表示。
If K = N Then
COUNT=COUNT+1
Print Using"###: ";COUNT;
For I=1 To N: Print Using"##";A(I);: Next I
Print
Exit Sub
End If
'
' B(K)は、深さKの節点が生成される順序。
B(K)=B(K)+1
'
If B(K) Mod 2 = 1 Then
' B(K)が奇数の場合、要素K+1を末尾から挿入していく。
' 深さK+1のK+1個の節点を生成する。
For I=K+1 To 1 Step -1
' I番目の要素を1つ右にずらし、I番目に要素K+1を挿入。
A(I+1)=A(I)
A(I)=K+1
' 節点を作成。
Call Perm(K+1)
Next I
'
' 状態を戻す。
For J=2 To K+1: A(J-1)=A(J): Next J
Else
' B(K)が偶数の場合、要素K+1を先頭から挿入していく。
' 節点全体を1つ右にずらす。
For J=K To 1 Step -1: A(J+1)=A(J): Next J
'
' 深さK+1のK+1個の節点を生成する。
For I=1 To K+1
' I番目の要素を1つ左にずらし、I番目に要素K+1を挿入。
A(I-1)=A(I)
A(I)=K+1
' 節点を作成。
Call Perm(K+1)
Next I
End If
End Sub
