2017-11-20 13 views
0

私は騎士のツアーを解決するのに役立つ方法を持っています。私は解決策を見つけたら直ちに私の再帰を止めたいと思っています。スカラーの再帰はありません

最終的には、ほぼ20種類のソリューションが返されます。私は下に私のコードを追加しました、誰かがここで何が間違っていることを指摘してくださいできますか?おそらくあなたの問題ザッツ

def myRecursion(dimension: Int, solution: Solution) : Option[Solution] = { 

    if (dimension * dimension == solution.size) { 
     println("Stop it now") 
     Some(solution) 
    } else { 
     val movesAvailable = possibleMoves(dimension, solution, solution.head) 
     val bestm = bestMoves(movesAvailable) 

     if (bestm.isDefined) { 
      myRecursion(dimension, bestm.get ::: solution) 
     } else { 
      movesAvailable.foreach{ x => 
       if(myRecursion(dimension, x:: solution).isDefined){ 
        x::solution; 
       } 
      } 
      None 

     } 
    } 
} 
+0

@RameshMaharjan残念ながら、それは私の問題を解決しませんでした。ソリューションが含まれているときに停止しようとしています(次元*次元)要素数 – Siyavash

+0

私の分析ミス、次元は決して増加することはありませんが、ソリューションサイズは決してありません。だからその反対の方向。ディメンションの変更* dimension == solution.size to dimension * dimension <= solution.size –

+0

@RameshMaharjan残念ながら、 "=="と同じ出力を表示します。 – Siyavash

答えて

1
movesAvailable.foreach{ x => 
       if(myRecursion(dimension, x:: solution).isDefined){ 
        x::solution; 
       } 
      } 
None 

。ループ内で関数を再帰的に呼び出すのですが、成功した場合はループを実際に終了しません。おそらくmyRecursionsがNoneを返している間、takeWhileに進むことができます。

また、そのコードは今何もしていません。何かに評価されるif文がありますが、何も何も返されません。

+0

ありがとうございます。私はx :: solutionを返すとループを終了すると思った。このコードを書き直さなければならない場合、どのような解決策をお勧めしますか?私は間違いなくtakeWhileを調べますが、if文を修正する方法はわかりません – Siyavash

+0

私はコードからはわかりませんが、おそらくmovesAvailableはいくつかの型のリストですか? foreachは、あなたがそこで使用したい機能ではありません。「リスト内の各項目をループし、いくつかの関数を実行してから、結果を破棄します。副作用のあるものに使用されます。たとえば、リスト内のすべてのものをコンソールに出力します。 – Ren

+0

この状況では、takeWhileが望ましいです。この関数の機能は、「リスト内のアイテムを調べ、ブール値を返す関数を評価し、結果が真であれば、さらにアイテムを取得します。それ以外の場合は停止します」。あなたのコードは次のようになります movesAvailable.takeWhile(x => myRecursion(dimension、x :: solution).isEmpty).headOption headOptionは、「リストの最初の項目を取ります」という意味です。 – Ren

関連する問題