私はScalaにとって新しく、範囲[i; j]の数値の素数を見つけなければなりません。ストリームを反復する
val stream = (i to j).toStream
、その後、私は素数を見つけることになって、この関数を呼び出す:例外なぜ私は取得していますストリームを出力
def findPrimes(s: Stream[Int]): Stream[Int] = {
println("HEAD: " + s.head)
return findPrimes(s.tail)
// s.head #:: findPrimes(s.tail.filter(_ % s.head != 0))
}
は、私は驚いて、コンソールには: これは私がストリームを埋める方法です
Exception in thread "main" java.util.NoSuchElementException: head of empty stream
at scala.collection.immutable.Stream$Empty$.head(Stream.scala:1104)
at scala.collection.immutable.Stream$Empty$.head(Stream.scala:1102)
at com.example.anna.app.HelloWorld$.findPrimes(HelloWorld.scala:43)
STREAM SIZE IS 100
at com.example.anna.app.HelloWorld$.prime(HelloWorld.scala:32)
HEAD: 1
at com.example.anna.app.HelloWorld$.delayedEndpoint$com$example$anna$app$HelloWorld$1(HelloWorld.scala:11)
HEAD: 2
HEAD: 3
at com.example.anna.app.HelloWorld$delayedInit$body.apply(HelloWorld.scala:3)
HEAD: 4
at scala.Function0.apply$mcV$sp(Function0.scala:34)
HEAD: 5
HEAD: 6
at scala.Function0.apply$mcV$sp$(Function0.scala:34)
HEAD: 7
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
HEAD: 8
HEAD: 9
at scala.App.$anonfun$main$1$adapted(App.scala:76)
HEAD: 10
HEAD: 11
at scala.collection.immutable.List.foreach(List.scala:389)
HEAD: 12
at scala.App.main(App.scala:76)
HEAD: 13
at scala.App.main$(App.scala:74)
HEAD: 14
HEAD: 15
at com.example.anna.app.HelloWorld$.main(HelloWorld.scala:3)
HEAD: 16
at com.example.anna.app.HelloWorld.main(HelloWorld.scala)
HEAD: 17
17から始めて、最後には例外がありません。 また、このコメント行は機能しません - 同じ例外がスローされます。
ヘルプ&アドバイスをいただければ幸いです。
次のように尾が(そこストリームを通過するためのより良い方法がありますが、私は非常にあなたのコードを変更しないで試してみました)空のとき
だから我々は、空のストリームを返すために、このストリームをパターン一致させることができますしかし、私はどのようにストリームを制限し、そこに[i; j]?私は100の第一素数を必要としない場合、範囲内のすべての素数を見つけてn番目に戻らなければなりません。 – alalambda
無限のストリームを置くとすべてのケースをカバーできます。無限の流れは実際に有限です。余分なメモリは必要ありません。 – pamu