C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: アルゴリズム 8王妃問題


(過去ログ 106 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■63472 / inTopicNo.1)  アルゴリズム 8王妃問題
  
□投稿者/ tkana3 (1回)-(2012/08/30(Thu) 14:42:28)

分類:[Java] 

2012/08/30(Thu) 14:49:22 編集(投稿者)

よろしくお願いします。

「Javaによるアルゴリズムとデータ構造」著柴田望洋

下記ソースで、出力が以下のようになるのですが、途中の出力から
1番目の出力「00000000」出力後、printメソッドが呼ばれたあと、7番目の出力結果「00000007」までfor文が繰り返されたあと、どのようなロジックで「00000010」が出力されるのでしょうか。


出力
00000000
00000001
00000002
 :
77777777


ソース

// 各列に1個の王妃を配置する組合せを再帰的に列挙

class EightQueen {


static int[] pos = new int[8]; // 各列の王妃の位置

//出力
static void print() {
for (int i = 0; i < 8; i++)
System.out.printf("%2d", pos[i]);
System.out.println();
}

//--- i列目に王妃を配置 ---//
static void set(int i) {
for (int j = 0; j < 8; j++) {
pos[i] = j; // 王妃をj行に配置
if (i == 7) // 全列に配置終了
print();
else
set(i + 1); // 次の列に王妃を配置
}
}

public static void main(String[] args) {
set(0); // 0列目に王妃を配置
}
}


引用返信 編集キー/
■63473 / inTopicNo.2)  Re[1]: アルゴリズム 8王妃問題
□投稿者/ shu (51回)-(2012/08/30(Thu) 15:58:21)
No63472 (tkana3 さん) に返信

set(0) >
pos[0]=0
set(1) >
pos[1]=0
set(2) >
pos[2]=0
set(3) >
pos[3]=0
set(4) >
pos[4]=0
・・・
set(7) >
pos[7]=0
printout
pos[7]=1
printout
pos[7]=2
printout
pos[7]=3
printout
・・・
pos[7]=7
printout
set(7) <
pos[6]=1
set(7) >
pos[7]=0
printout
pos[7]=1
printout
pos[7]=2
printout
pos[7]=3
printout
・・・
pos[7]=7
printout
set(7) <
・・・
・・・
printout => 00000077
set(7) <
set(6) <
・・・
・・・
・・・
・・・
printout => 77777777
set(7) <
set(6) <
set(5) <
set(4) <
set(3) <
set(2) <
set(1) <
set(0) <

という感じです。>は呼び出し、<は戻りです。
引用返信 編集キー/
■63474 / inTopicNo.3)  Re[1]: アルゴリズム 8王妃問題
□投稿者/ 774RR (1回)-(2012/08/30(Thu) 16:15:20)
まだ n-Queen の「置いてよい」判定をする前の段階、ということですな・・・
自明である=解説不要なような気がするけど、どこがどうわからないのだろうか。

再帰が8段階目に入ったところでは i=7, j=0..7 となるわけで
・ pos[7] に対して 0 がセットされ print される
・ pos[7] に対して 1 が以下略
・ pos[7] に 7 以下略
なのは理解できているものとする。ここで再帰8段目は終了し、7段目に戻る。

再帰7段目に戻った直後の時点では 再帰7段目での j は j=0 である。
for が進むことで j=1 になる (変化するのは再帰7段目の j )
再帰7段目では i=6 だから pos[6]=1 が行われる (pos[0]..pos[5] は変更されない)
再帰8段目にまた入ると pos[7] に対して 0..7 がセットされる。

再帰の各段における j や i (i+1) がすべて別変数であるのが味噌ね。
引用返信 編集キー/
■63475 / inTopicNo.4)  Re[2]: アルゴリズム 8王妃問題
□投稿者/ tkana3 (2回)-(2012/08/30(Thu) 16:59:50)
No63473 (shu さん) に返信
> ■No63472 (tkana3 さん) に返信
>
> pos[6]=1
> set(7) >
> pos[7]=0
> printout
> という感じです。>は呼び出し、<は戻りです。

ありがとうございます。

printoutで「00000010」が出力されんですね。

この戻りの処理はなぜ(どのように)発生しますか?
どこにもマイナスのロジックがないようですが…
引用返信 編集キー/
■63476 / inTopicNo.5)  Re[3]: アルゴリズム 8王妃問題
□投稿者/ shu (52回)-(2012/08/30(Thu) 17:06:47)
No63475 (tkana3 さん) に返信
> この戻りの処理はなぜ(どのように)発生しますか?
> どこにもマイナスのロジックがないようですが…
処理が終了して戻ってくれば自然と呼び出し前の値になるのです。
set(0)で呼ばれたときのiとset(1)で呼ばれたときのiは別物です。
各set呼び出しの前後にiの値と呼び出しと戻りを表現するprintを行ってみると
分かるかもしれません。

引用返信 編集キー/
■63480 / inTopicNo.6)  Re[4]: アルゴリズム 8王妃問題
□投稿者/ tkana3 (3回)-(2012/08/31(Fri) 11:29:50)
No63476 (shu さん) に返信
> ■No63475 (tkana3 さん) に返信
>>この戻りの処理はなぜ(どのように)発生しますか?
>>どこにもマイナスのロジックがないようですが…
> 処理が終了して戻ってくれば自然と呼び出し前の値になるのです。
> set(0)で呼ばれたときのiとset(1)で呼ばれたときのiは別物です。
> 各set呼び出しの前後にiの値と呼び出しと戻りを表現するprintを行ってみると
> 分かるかもしれません。
>

ありがとうございます。「8王妃問題」は解決していませんが、一応解決とさせてください。
「8王妃問題」がわからないのではなく、再帰呼び出しの「戻り」というものがわかっていない
のだと思います。階乗を求めるプログラムでそのような処理を行っているのは分かるのですが。
少し調べてから、また質問させてください。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -