順列生成(交換法)問題(1)の考察1を示します。
問題(1)の考察1
' << CH101.bas >> ' 問題(1)の考察1に基づく順列生成プログラム。 ' Tiny Basic ' Public A(9) ' 順列を保存する配列。 Public N ' 要素数。 Public COUNT ' 生成された順列の個数。 ' Do ' Nの読み込み。 Read N If (N <= 0) Or (N > 9) Then Exit Do Data 1, 2, 3, 4, 0 ' ' 初期設定。 COUNT=0 ' 順列生成。 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 ' ' 順列を右にひとつずらす。 For I=K To 1 Step -1: A(I+1)=A(I): Next I ' 先頭に要素K+1を代入。 A(1)=K+1 ' Call Perm(K+1) ' ' 深さKのK個の子節点を生成する。 For I=2 To K+1 ' 1番目の要素K+1をI番目と交換。 A(1)=A(I): A(I)=K+1 ' 深さK+1の子節点を作成する。 Call Perm(K+1) ' 状態を戻す。 A(I)=A(1) Next I ' 順列を左にひとつずらす。 W=A(1) For I=2 To K: A(I-1)=A(I): Next I A(K)=W End Sub