これは、スドクソルバーのためのもので、各四角形にはこのメソッドがあります。私の考えは、このメソッドの1つのインスタンスが有効な値を見つけずにループを通過する場合、呼び出された以前のメソッドに戻り、forループから次の値を試してループを続行するということです。私はこれがバックトラックのために十分であることを望んでいましたが、私のテストはすべて失敗し、私はこの問題をどのように解決するのか完全に無知です。ここで/終了のnoob-嘆き擬似再帰的メソッドにバックトラックを組み込む方法を見つけることができません
public boolean recursive() {
for(int i = 1; i <= boardSize; i++) {
if(!validValue(i)) {
continue;
} else {
setValue(i);
if(getNext() == null) // This signifies that I am at the end of the list
return true;
else
getNext().recursive(); // same method in the next sudoku square
}
}
return false;
}
このコードは、実際に何が起こっているのかわかりません。アルゴリズムの構造は何ですか?また、 'validValue'、' setValue'、 'getNext'、' recursive'は何をしますか?自信を持って何が間違っているとは言えませんが、バックトラッキング中の変更を元に戻していないと思います。検索で解決策が見つからない場合は、バックトラッキングする前に変更した永続状態をリセットする必要があります。 – Heatsink
申し訳ありませんが、私は、メソッド名が自明であると考えていたことは間違っていました。 validValue(i)は、四角形に関係するボックス/行/列にiが見つかったかどうかをチェックします。 setValue()は、各四角形の値に対する設定子です。 getNext()は、スコークボード上の次の四角形を返します。私はこれを見て申し訳ありませんが、なぜsetValueメソッド()が間違った値を上書きするだけで、値をリセットする必要がありますか? – jollyroger
それはおそらくあなたの場合には関係ありません。いくつかの検索アルゴリズムでは、再帰的インスタンスは、前のステップによって行われた推測を上書きすることができます。各再帰インスタンスはアルゴリズム内の別々のデータを変更するため、元に戻すことは重要ではありません。 – Heatsink