0

これは 8 つのクイーンの Java コードです。なぜ8回も同じ結果になるのかわかりません。このコードでは、対角線は含まれていません。

import java.util.*;

class eightTeight {
    Set<Integer> s = new HashSet<Integer>();

    public void print() {
        if (s.size() < 8) {
            for (int i = 0; i < 8; i++) {
                if (!s.contains(i)) {
                    s.add(i);
                    print();
                }
            }
        }
        System.out.println(s);
        return;
    }
}

return が実行されると、 s はまだデータを保持しているようです。どんな助けにも感謝します。

4

3 に答える 3

0

それはあなたの再帰的な呼び出しによって引き起こされました

print();

そして、JAVAにはグローバル変数がないことを理解する必要があります。「print()」を呼び出すたびに、空の「Set」を使用し、それにsthを追加して、出力します。ここでは8回の再帰があるため、コンソールが同じものを出力するのは8回です。これがあなたが期待に失敗する理由です。

于 2012-11-25T18:43:25.657 に答える
0

「なぜ8回も同じ結果になるのか分からない」.

メソッドを再帰的に 8 回呼び出しているため、そのたびに結果が出力されます。

for(int i=0;i<8;i++){
            if(!s.contains(i)){
                s.add(i);
                print();
            }
        }

印刷をメソッドの外に持っていきます。

于 2012-11-25T17:15:53.170 に答える
0

Java では、オブジェクトをメソッドに渡すときに、オブジェクトへの参照をコピーします。そのため、オブジェクトに加えられた変更は、そのオブジェクトへのすべての参照 (呼び出し元のメソッドに保持するものを含む) によって表示されます。

それには2つの解決策があります:

  1. 修正前に をコピーHashSetし、そのコピーに対して修正を行います。解決策が見つかった場合は、新しいコピーを返却してください。うまくいかない場合は原本を返却してください。

  2. インデックスに依存するデータ構造を使用して、まだ設定されていないすべての値を無視できるようにします。たとえば、配列の場合、5 番目のクイーンを繰り返し処理している場合、5 番目、6 番目、7 番目、8 番目のクイーンの値が設定されていれば無視できます。

int 配列で実装されたクイーンの問題はより明確ですが、それはみんなの好みに任されています。

于 2012-11-25T17:17:15.520 に答える