第11講 Subプロシージャの再帰的使用の学習

第8話 カウンタ、次数、配列を引数でSubプロシージャに引き渡す

Private Sub CommandButton1_Click()

  Dim a(15) As Byte
  Dim n As Byte
  Dim cn As Long

  n = Cells(2, 10)
  cn = 0
  f 0, cn, n, a()

  Cells(3, 13) = cn

End Sub

Sub f(g As Integer, cn As Long, n As Byte, a() As Byte)

  Dim i As Byte, j As Byte, h As Byte

  For i = 1 To n
    a(g) = i
    h = 1
    If g > 0 Then
      For j = 0 To g - 1
        If a(g) = a(j) Then
          h = 0
          Exit For
        End If
      Next
   End If
   If h = 1 Then
      If g + 1 < n Then
        f g + 1, cn, n, a()
      Else
        For j = 0 To n - 1
          Cells(5 + 2 * Int(cn / 10), 1 + (n + 1) * (cn Mod 10) + j) = a(j)
        Next
        cn = cn + 1
      End If
    End If
  Next

End Sub

説明を忘れていましたが、セル番号を私がgとしているのは、
C言語で魔方陣作成プログラムを研究していたとき、
結果をディスプレイに表示させていて、画面位置からgとしていました。

f 0, cn, n, a() vs Sub f(g As Integer, cn As Long, n As Byte, a() As Byte)
と、セル番号、カウンタ、順列次数、配列を引数で引き渡せば、
グローバル変数やグローバル配列は必要ないことになります。

それにしてもSubプロシージャのf 0, cn, n, a() という表現方法は気持ちが悪ですね。
C言語やVC++なら、f(0,cn,n,a(9))というすっきりした表現方法になります。
これなら、fが0,cn,n,a()の関数であることが明確になります。
VBでも、Funcitonプロシージャなら、C言語などと同じf(0,cn,n,a(9))というすっきりした表現が可能なのです。
VBやVBAの文法作成者の方に、Subプロシージャでもf(0,cn,n,a(9))というすっきした表現方法の採用をお願いしたいと思います。

尚、配列をプロシージャに渡すことについては、後に独立の講を設ける予定です。

一応、Subプロシージャの再帰的使用の基礎的な学習はこれで終わりにしたいと思います。
この後、Funcitonプロシージャ再帰的使用を学習してから、何講か後に再びSubプロシージャの再帰的使用の応用を考えたいと思います。
そこでは、今回のn×n順列を

と2次元に並べ、順列の内で魔方陣の条件をもつものを、シートに表示するということで魔方陣自動作成プログラムの制作に挑戦します。
これは、9!=1×2×3×・・・×9=362880の場合についてすべて調べ、その中で魔方陣になっているもを探すというかなり強引なものです。
さすがのコンピュータでも、この方法だと4次魔方陣が限界です。
何しろ4次魔方陣の場合16!=1×2×3×・・・×16=20922789888000≠21兆通りも場合の数があるからです。
5次魔方陣では、25!=1×2×3×・・・×25=21.5511210043331E+25通りも場合の数があり、パソコンでは歯が立ちません。
魔方陣普遍超高速版のような高速版を作りには、まだまだいろいろと工夫が必要です。
この講義のトップに書いてある通り、この講義の最終講義は数独問題の自動作成ソフトの制作ということになっています。
数独問題の自動作成ソフトの制作の他にもう一つ目的があります。
それは魔方陣の超高速自動生成ソフトの制作です。
学習の進展とともに魔方陣自動作成プログラムは次第に高度なものになっていきます。




第7話へ 第12講第1話へ

004
  


VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る