第9講 サブプロシージャの再帰的使用

第18話 魔方陣生成ソフトのコード解説その8
oiu
ht
コード主要部分再掲
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話へ
004

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入門へ
本サイトトップへ