2012-04-17 3 views
0

これは、スドクソルバーのためのもので、各四角形にはこのメソッドがあります。私の考えは、このメソッドの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; 
} 
+0

このコードは、実際に何が起こっているのかわかりません。アルゴリズムの構造は何ですか?また、 'validValue'、' setValue'、 'getNext'、' recursive'は何をしますか?自信を持って何が間違っているとは言えませんが、バックトラッキング中の変更を元に戻していないと思います。検索で解決策が見つからない場合は、バックトラッキングする前に変更した永続状態をリセットする必要があります。 – Heatsink

+0

申し訳ありませんが、私は、メソッド名が自明であると考えていたことは間違っていました。 validValue(i)は、四角形に関係するボックス/行/列にiが見つかったかどうかをチェックします。 setValue()は、各四角形の値に対する設定子です。 getNext()は、スコークボード上の次の四角形を返します。私はこれを見て申し訳ありませんが、なぜsetValueメソッド()が間違った値を上書きするだけで、値をリセットする必要がありますか? – jollyroger

+0

それはおそらくあなたの場合には関係ありません。いくつかの検索アルゴリズムでは、再帰的インスタンスは、前のステップによって行われた推測を上書きすることができます。各再帰インスタンスはアルゴリズム内の別々のデータを変更するため、元に戻すことは重要ではありません。 – Heatsink

答えて

2

二つの正しさの問題:

  1. 再帰invokationから結果がtrueた場合は、確認する必要があります - それがある場合、あなたは再帰を停止する必要があります - あなたが発見しました解決策、それを無効にしないでください! getNext().recursive();利回りtrue場合 - - あなたがすべきバブルこのtrueアップ[と(1)で述べたように - あなたは解決策を持っている、再帰を止める!]
あなたが特にバブルアップ再帰の戻り値を、するべき
  • +0

    貴重なご意見ありがとうございます。あなたの意見を反映させるために上記のコードを編集しましたが、私は盲目でこれを刺していると感じています。私は再帰関数がどのように機能するのかを理解していると信じていますが、それは問題を起こすような実装部分です。上の私の編集はあなたのアドバイスを反映していますか? – jollyroger

    +0

    @jollyroger:それは私が取り組む問題を解決します - 今は正しいかどうか分かりません。また、他の人も同じことを学ぶかもしれないので、元のコードに戻しています!コードがまだ失敗している場合は、コードが失敗する理由とその理由を記述した新しい質問を投稿する必要があります。 – amit

    +0

    ありがとうございました。 – jollyroger

    0

    あなたはgetNext()を2回呼びます。 if文でnullが返されない場合は、再度呼び出します。あなたはそれをしたいと思いますか?

    1

    OK - 私の仲間が私を助けてくれて、何が欠けていたのか理解できるようになったので、誰もが何を知っているか知りたいと思ったらここで共有したいと思った行方不明

    ループが完了した後、メソッドはその値をリセットする必要があります。そうでない場合は、バックトラックの前に以前にテストされた古い値がバックトラックの後に残ります。これは、isValid()メソッドが、指定された四角形が属する列、行、およびボックスをチェックするときに、isValid()メソッドが以前に設定された値の大部分を見つけることを意味します。

    「return false;」の前に1行必要でした。

    //(end of for-loop) 
    setValue(0); 
    return false; 
    //(method ends) 
    
    関連する問題