2013-04-04 28 views
6

私は怠惰なストリームを返す代わりに、熱心にすべての結果を取得し、すべての結果が存在する場合にストリームする配列からそれらを変換するために、このScalaの機能を変換しようとしています。 toStream;私は(解決(xs.updated(POS、I)、POS))降伏Z - - Z < 9から1(I <のために)問題がにある感じています。forループのSeq出力をStream出力に書き換えるにはどうすればよいですか?

アドバイスありがとうございます。私が見ている別の解決策は、見つかったときに結果を返すことです。このソリューションではおそらく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 
    } 

答えて

10

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

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

これを試してみてください:

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 
関連する問題