第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 | ・ |
・ | ・ | ・ | 5 |