第16講 関数の再帰的呼び出しによる3次・4次魔方陣の作成
第7話 ソース解説その4

続いてトレースしていきたいと思いますが、1つだけ注意点を挙げてからトレースを続けます。
それは、

0 1 2 3
0 0 1 2 3
1 2 3 16
1 4 5 6 7
□ □ □ □
2 8 9 10 11
□ □ □ □
3 12 13 14 15
□ □ □ □


今までこのように書いてきましたが、
実際にはg=4以降の世界は、
まだ存在していませんから、
正確には、

0 1 2 3
0 0 1 2 3
□1□ □2□ □3□ 16


と書かないといけませんし、
g=3の世界のループが終わり、
g=2の世界に戻ったときも、
g=3の世界は消滅してしまっていますので、

0 1 2
0 0 1 2
□1□ □2□ □4□


のように書くのが正解です。
関数は終わると消滅するのです。
つまり、その世界が消滅するのです。
ですからこれからの動きは正確に書いていくことにします。
で動きをしばらく追いましょう。


0 1 2
0 0 1 2
□1□ □2□ □4□


0 1 2 3
0 0 1 2 3
□1□ □2□ □4□ □1□


0 1 2 3
0 0 1 2 3
□1□ □2□ □4□ □2□


0 1 2 3
0 0 1 2 3
□1□ □2□ □4□ □3□










0 1 2 3
0 0 1 2 3
□1□ □2□ □4□ □4□


0 1 2 3
0 0 1 2 3
□1□ □2□ □4□ □5□


0 1 2 3
0 0 1 2 3
□1□ □2□ □4□ □6□




・・・




0 1 2 3
0 0 1 2 3
□1□ □2□ □4□ □16□








ここまで来ても横合計は23にしかならず、再びg=3の世界は終了消滅して、g=2の世界に戻り、

0 1 2
0 0 1 2
□1□ □2□ □5□


となり、再びg=3の世界に飛び(とんだ瞬間にg=3が生成(創造)される)、

0 1 2 3
0 0 1 2 3
□1□ □2□ □5□ □1□


0 1 2 3
0 0 1 2 3
□1□ □2□ □5□ □2□


0 1 2 3
0 0 1 2 3
□1□ □2□ □5□ □3□







・・・・・・

0 1 2 3
0 0 1 2 3
□1□ □2□ □5□ □16□


これでも合計は24にしかならず、
               if(x==n-1){
                 wa=0;
                 for(j=0;j<n;j++)wa+=a[y][j];
                 if(wa!=n*(n*n+1)/2)h=0;
               }
をクリアできません。
以下同様に動いていって

0 1 2 3
0 0 1 2 3
□1□ □2□ □15□ □16□


になったときはじめて横合計が34になって、
               if(x==n-1){
                 wa=0;
                 for(j=0;j<n;j++)wa+=a[y][j];
                 if(wa!=n*(n*n+1)/2)h=0;
               }
をクリアして、ようやくg=4の世界の創造ということになって、

0 1 2 3
0 0 1 2 3
1 2 15 16
1 4 5 6 7
□ □ □ □


となります。

本当はg=5以降の世界はありませんが、
表を書くのがむずかしいので書いてあるだけです。







以下同様に動いていって

0 1 2 3
0 0 1 2 3
1 2 15 16
1 4 5 6 7
12 14 3 5
2 8 9 10 11
13 7 10 4
3 12 13 14 15
8 11 6 9


と1個目の魔方陣が出来上がります。



















途中かなりはしょりましたが、皆さんははしょった部分をご自分でトレースしてみて下さい。
次講では、さらにソフトの改良を行います。




第16講第6話へ 第17講(旧講義)第1話へ 第17講(再講義)第1話へ



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