Próbowałem przekonwertować tę funkcję Scala, aby zwrócić leniwy strumień zamiast z niecierpliwością odzyskać wszystkie wyniki i przekonwertować je z Seq na strumień, gdy wszystkie wyniki są obecne. Mam wrażenie, że problem leży w (dla (i < - od 1 do 9; z < - rozwiązać (xs.updated (pos, i), pos)) wydajność z) toStream.Jak przepisać wyjście dla pętli for na wyjście Stream?
Każda rada jest doceniana. Inne rozwiązanie, na które patrzę, to zwrócenie wyniku, gdy zostanie znaleziony. Dzięki temu rozwiązaniu prawdopodobnie zwróciłem tylko jeden wynik. Dzięki
isConflictAt(xs.updated(pos, 0), pos, xs(pos)
jest funkcją sprawdzania ograniczeń.
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
}