2013-04-04 5 views
6

मैंने इस स्काला फ़ंक्शन को सभी परिणामों को उत्सुकता से पुनर्प्राप्त करने के बजाय आलसी स्ट्रीम वापस करने और सभी परिणामों के मौजूद होने पर उन्हें सेक से स्ट्रीम में बदलने के बजाय आलसी स्ट्रीम को वापस करने की कोशिश की है। मुझे लगता है कि यह समस्या में है (के लिए (i < - 1 से 9; z < - हल करें (xs.updated (pos, i), pos)) उपज 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 
    } 

उत्तर

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 
संबंधित मुद्दे