すべての結果を熱心に取得し、すべての結果が存在するときに Seq から Stream に変換するのではなく、この Scala 関数を遅延ストリームを返すように変換しようとしました。問題は(for (i <- 1 to 9; z <- solve(xs.updated(pos, i), pos)) yield z) toStream にあると感じています。
アドバイスをいただければ幸いです。私が検討している別の解決策は、見つかったときに結果を返すことです。このソリューションでは、おそらく 1 つの結果しか返されません。ありがとう
isConflictAt(xs.updated(pos, 0), pos, xs(pos)
制約チェック機能です。
def solve(xs : List[Int], pos: Int): Stream[List[Int]] = {
if (!isConflictAt(xs.updated(pos, 0), pos, xs(pos))) {
val pos = xs.indexOf(0)
if (pos < 0) {println(xs); Stream(xs) } else (for (i <- 1 to 9; z <- solve(xs.updated(pos, i), pos)) yield z) toStream
} else Stream.empty
}