第4話 再帰的呼び出しプログラムの解説その3
さて、いよいよ3次順列ループ版の残された部分
If h2 = 1 Then
sousuua = sousuu Mod 8
sousuus = Int(sousuu / 8)
sousuu = sousuu + 1
For l = 1 To 3
Cells(5 + sousuus * 2, 1 + l + sousuua * 4)
= jyn(l)
Next
End If
の解説をしましょう。この解説の後、第11講メインの再帰的呼び出しの解説に入ります。
この部分は、2つの試験
h1 = 1
For k = 1 To 1
If jyn(2) = jyn(k) Then
h1 = 0
Exit For
End If
Next
h2 = 1
For l = 1 To 2
If jyn(3) = jyn(l) Then
h2 = 0
Exit For
End If
Next
を通った
i | j | k |
1 | 1 | |
1 | 2 | 1 |
1 | 2 | 2 |
1 | 2 | 3 |
1 | 3 | 1 |
1 | 3 | 2 |
1 | 3 | 3 |
2 | 1 | 1 |
2 | 1 | 2 |
2 | 1 | 3 |
2 | 2 | |
2 | 3 | 1 |
2 | 3 | 2 |
3 | 1 | 1 |
3 | 1 | 2 |
3 | 1 | 3 |
3 | 2 | 1 |
3 | 2 | 2 |
3 | 2 | 3 |
3 | 3 |
のピンクの部分(正しい順列)の表示を担当しています。
2つの試験では、
jyn(2)≠jyn(1)かつjyn(3)≠jyn(1)かつjyn(3)≠jyn(2)
を満たしているか確認しています。つまり、
1 | 2 | 3 |
の各マスの数字の重複がないか調べています。
この2つの試験を通った場合のみが
If h2 = 1 Then
sousuua = sousuu Mod 8
sousuus = Int(sousuu / 8)
sousuu = sousuu + 1
For l = 1 To 3
Cells(5 + sousuus * 2, 1 + l + sousuua * 4)
= jyn(l)
Next
End If
の部分が実行され表示されます。
sousuua = sousuu Mod 8はできた順列の総数を8で割った余りを出す式です。
それに対してsousuus = Int(sousuu / 8)は総数を8で割ったときの商です。
今回は8を選んでいますが、この数字はある制限下任意のものを選ぶことができます。
できた順列を横に8個ごと表示し、
8個を超える度に1つ行をあけて下に表示させています。
それがsousuus * 2の意味です。1つ行をあけさせなければ、
sousuusでもいいわけですが、見やすさを優先して1つ行をあけています。
sousuua * 4の4は3+1です。3は3次順列の3です。
1足しているいる理由は、
1個順列が表示された後、列が1つ空くようにしているわけです。
以上の結果、次のように表示されます。
1 | 2 | 3 | 1 | 3 | 2 | 2 | 1 | 3 | 2 | 3 | 1 | 3 | 1 | 2 | 3 | 2 | 1 |
縦列総数が6個しかないので、1行で済んでいます。
8個を超える場合1つ行をあけて、下の行に表示されます。
注意事項は記述の順番です。
sousuu = sousuu + 1
sousuua = sousuu Mod 8
sousuus = Int(sousuu / 8)
だとうまくいきません。商も余りも最初は、0に統一しないとだめだからです。
では、次話で第11講のメインの再帰的呼び出しの解説にはいることにしましょう。