第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

を通った

のピンクの部分(正しい順列)の表示を担当しています。
2つの試験では、
jyn(2)≠jyn(1)かつjyn(3)≠jyn(1)かつjyn(3)≠jyn(2)
を満たしているか確認しています。つまり、

の各マスの数字の重複がないか調べています。
この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講のメインの再帰的呼び出しの解説にはいることにしましょう。


第3話へ 第5話へ