第9講 サブプロシージャの再帰的使用
第18話 魔方陣生成ソフトのコード解説その8
コード主要部分再掲
Sub f(g As Integer)
Dim i As Integer, j As Integer
For i = 1 To n * n
If g > 0 Then
For j = 0 To g - 1
If i = a(j) Then GoTo tobi
Next
End If
a(g) = i
If g Mod n = n - 1 Then
w = 0
For j = 0 To n - 1
w = w + a(n * Int(g / n) + j)
Next
If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
End If
If Int(g / n) = n - 1 Then
w = 0
For j = 0 To n - 1
w = w + a(n * j + (g Mod n))
Next
If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
End If
If g = n * n - 1 Then
w = 0
For j = 0 To n - 1
w = w + a(n * j + j)
Next
If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
End If
If g = n * (n - 1) Then
w = 0
For j = 0 To n - 1
w = w + a(n * j + n - 1 - j)
Next
If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
End If
If g + 1 < n * n Then
Call f(g + 1)
Else
Call h
End If
tobi:
Next
End Sub
解説の続き
1 | 2 | 9 |
4 | 5 | 6 |
7 | 8 | 9 |
消滅して
1 | 2 | |
4 | 5 | 6 |
7 | 8 | 9 |
f(1)の世界すなわちセル位置番号
0 | 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
1の世界に戻り、Nextによりiは3となり、
1 | 3 | |
4 | 5 | 6 |
7 | 8 | 9 |
となり、再びf(2)を呼び出し発生させます。
重複検査や行合計検査をクリアできずに、
1 | 3 | 1 |
4 | 5 | 6 |
7 | 8 | 9 |
1 | 3 | 2 |
4 | 5 | 6 |
7 | 8 | 9 |
1 | 3 | 2 |
4 | 5 | 6 |
7 | 8 | 9 |
1 | 3 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
1 | 3 | 4 |
4 | 5 | 6 |
7 | 8 | 9 |
・・・
1 | 3 | 9 |
4 | 5 | 6 |
7 | 8 | 9 |
まで進みますが、
結局行合計検査をクリア出来ずに、
再びf(2)は消滅の憂き目を見ます。
以下
1 | 4 | 1 |
4 | 5 | 6 |
7 | 8 | 9 |
1 | 4 | 2 |
4 | 5 | 6 |
7 | 8 | 9 |
1 | 4 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
・・・
1 | 4 | 9 |
4 | 5 | 6 |
7 | 8 | 9 |
最後までいっても行合計検査をクリアできません。
結局
1 | 5 | 9 |
4 | 5 | 6 |
7 | 8 | 9 |
まで進んで始めて行合計検査に合格して、
いよいよf(2)はf(3)を呼び出して生成し、
1 | 5 | 9 |
1 | 5 | 6 |
7 | 8 | 9 |
重複検査をクリアできず
1 | 5 | 9 |
2 | 5 | 6 |
7 | 8 | 9 |
となり、
f(3)はf(4)を呼び出し分身を作り出して、
1 | 5 | 9 |
2 | 5 | 6 |
7 | 8 | 9 |
重複検査をクリアできるまでFor文を進め
1 | 5 | 9 |
2 | 3 | 6 |
7 | 8 | 9 |
となり、f(4)は分身f(5)を呼び出し、
1 | 5 | 9 |
2 | 3 | 6 |
7 | 8 | 9 |
重複検査をくりぬけるまで
For文を進めて、
1 | 5 | 9 |
2 | 3 | 4 |
7 | 8 | 9 |
となりますが、
行合計試験に合格できずに、
1 | 5 | 9 |
2 | 3 | 9 |
7 | 8 | 9 |
まで進んでも重複検査と行合計検査はクリアできずに、
f(5)は消滅の運命を辿ります。
以下
1 | 5 | 9 |
2 | 4 | 3 |
7 | 8 | 9 |
1 | 5 | 9 |
2 | 4 | 6 |
7 | 8 | 9 |
1 | 5 | 9 |
2 | 4 | 7 |
7 | 8 | 9 |
1 | 5 | 9 |
2 | 4 | 8 |
7 | 8 | 9 |
1 | 5 | 9 |
2 | 4 | 9 |
7 | 8 | 9 |
と最後までいって両方の検査をクリアできずに、
f(5)は消滅し、
1 | 5 | 9 |
2 | 6 | 3 |
7 | 8 | 9 |
1 | 5 | 9 |
2 | 6 | 4 |
7 | 8 | 9 |
1 | 5 | 9 |
2 | 6 | 3 |
7 | 8 | 9 |
まで進み始めて、
2行目の行合計試験を突破して
1 | 5 | 9 |
2 | 6 | 3 |
4 | 8 | 9 |
とf(6)の世界すなわちセル位置番号
0 | 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
6の世界に進むわけです。
1 | 5 | 9 |
2 | 6 | 3 |
4 | 8 | 9 |
だと、列合計検査に合格できずに
1 | 5 | 9 |
2 | 6 | 3 |
7 | 8 | 9 |
1 | 5 | 9 |
2 | 6 | 3 |
8 | 8 | 9 |
1 | 5 | 9 |
2 | 6 | 3 |
9 | 8 | 9 |
最後までいっても列合計検査はクリアできません。
実は、魔方陣が出来るまでにはかなりの試行錯誤が行われているのです。
最初に1個は
2 | 7 | 6 |
9 | 5 | 1 |
4 | 3 | 8 |
が出来るまでには、かなりの人形の生成消滅が繰り返されます。
f(1)でさえ消滅を体験しているのです。
f(2)以降では、すなわち外側から3番目以降の人形では、
何度生成消滅を繰り返したのか、
数える気力がないほどです。
大分解説が長くなりました。
以後のトレース(コンピュータの動きを追うこと)は是非ご自分でなさって、
コンピュータの動きを追体験してください。
長くなりすぎた第9講はこれにて終了しまして、
第10講ファンクションプロシージャの再帰的呼び出しに歩を進めることにします。
第17話へ 第10講第1話へ
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ第2部へ
小学生からエンジニアまでのRuby入門へ
本サイトトップへ