8

すべての結果を熱心に取得し、すべての結果が存在するときに 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
  }
4

1 に答える 1

11

for (i <- 1 to 9; z <- solve(???)) yield zを意味し(1 to 9).flatMap{i => solve(???)}ます。この回答を参照してください。

遅延結果を生成するには、 orを使用して source( 1 to 9) を遅延させる必要があります。(1 to 9).view(1 to 9).toStream

これを試して:

scala> def solve(pos: Int): Stream[List[Int]] = {
     |   println(pos)
     |   Stream.fill(3)((1 to pos).map{ _ => util.Random.nextInt}.toList)
     | }
solve: (pos: Int)Stream[List[Int]]

scala> for{
     |   i <- (1 to 9).toStream
     |   z <- solve(i)
     | } yield z
1
res1: scala.collection.immutable.Stream[List[Int]] = Stream(List(-1400889479), ?)

scala> res1.force
2
3
4
5
6
7
8
9
于 2013-04-04T11:21:24.477 に答える