第2講 再帰的呼び出しで魔方陣を作ろう!
第4話 プログラム本体(再帰的呼び出しプロシージャ)の解説


では、プログラムソースの解説に入りましょう。
読者が疑問な点は、
    hh = 0
    If tyouhukuhantei(k - 1) = 1 Then GoTo owari
    tyouhukuhantei(k - 1) = 1
    hh = 1
         ・
         ・
owari:    
    If hh = 1 Then tyouhukuhantei(k - 1) = 0

  Next
の部分ではないでしょうか。
これはmah(i, j) = kによって、
魔方陣配列に数字を入れているわけですが
セルに同じ数字が入っていないかチェックしているのです。
例えば、4次魔方陣なら16のセルに1から16までの数字が1つずつ入る必要があります。
1から16の数字が使われている場合を1,まだ使われていない状態を0として、
チェックしているのです。
例えば、5という数字がすでに使われているなら、
tyouhukuhantei(4) = 1となっているわけです。
(配列の添え字は0から始まり、現在は0から使っているので添え字は1つ小さくなっていて、
5でなく4となる点に注意しましょう。)
つまり、このセルの以前のセルにすでに5という数字が使われているので、
今対象となっているセルに5という数字を入れるわけにはいきません。

 1  ・  ・  ・
 ・  5  ・  ・
 ・  ・  5  ・
 ・  ・  ・  ・

このとき、GoTo owariによってowari:に飛び次の文のNext
によってkは6と変わります。

 1  ・  ・  ・
 ・  5  ・  ・
 ・  ・  6  ・
 ・  ・  ・  ・


こうして重複した数字が入らないようにしているのです。
それではIf hh = 1 Then tyouhukuhantei(k - 1) = 0の意味は何でしょうか。
hh = 1ということは

 1  ・  ・  ・
 ・  4  ・  ・
 ・  ・  5  ・
 ・  ・  ・  ・

以前のセルには5は入っていないということになります。
したがって、対象セル(ピンクのセル)によって、tyouhukuhantei(4) = 1
になったということです。

そして、Nextによってkは6となり

 1  ・  ・  ・
 ・  4  ・  ・
 ・  ・  6  ・
 ・  ・  ・  ・

の状態になります。
5は使われていないのですから
tyouhukuhantei(4) = 0として、5の数字は使われていないとコンピュータに認識させなければなりません。

If hh = 1 Thenの部分の意味は対象のセルに今のループで入れられたときのみ、
キャンセルしなさいという意味です。
対象セルより前に5という数字が使われている場合、

 1  ・  ・  ・
 ・  5  ・  ・
 ・  ・  4  ・
 ・  ・  ・  

現在勝手にキャンセルするわけにはいきません。
ここでキャンセルしてしまいtyouhukuhantei(4) = 0
とすると、以前のセルに5が入っているのに、後のセル(セル位置番号で言うとg+1以上)で再び5が入ってしまう可能性を排除できないのです。
つまり2つのセルで5が使われしまうことになります。

 1  ・  ・  ・
 ・  5  ・  ・
 ・  ・  4  ・
 ・  ・  ・  


第2講第3話へ 第2項第5話へ 第3講第1話へ


VB入門講義応用編トップへ

VB入門講義トップへ