この質問はeuler project sum-of-primes, and Stream.viewに関連していますが、少し捻りがあります。私は200万以下のすべての素数の合計を計算したいと思います。Scala Stream [Int] #foldLeftとStream [Int] #sumは異なる結果を返します
@Test
def testEuler010a {
primes.view.takeWhile(_ < 2000000).foldLeft(0L)(_ + _) mustEqual 142913828922L
}
@Test
def testEuler010b {
primes.view.takeWhile(_ < 2000000).sum mustEqual 142913828922L
}
testEuler010a
は私を与える:私はストリーム[INT] #sumを使用して、2回の試験では、1ストリーム[INT] #foldLeftを使用し、1を書いた
lazy val primes: Stream[Int] = 2 #:: Stream.from(3).filter(i =>
primes.takeWhile(j => j * j <= i).forall(i % _ > 0))
:私は以下のように定義素数のジェネレータを作成しますtestEuler010b
の回答は1179908154
ではありません。私はStream[Int]#foldLeft(0L)(_ + _)
がStream[Int].sum
と同じであると期待しますが、そうではありません。 toList()
でStreamを具体化しても、同じ矛盾が生じます。それらのメソッドが同じ結果を与えるべきであるという誤った仮定ですか?
私はScala 2.9.1.finalを使用しています。
私の 'view'の使用は必要ありません。この場合パフォーマンスが改善されず、別の結果が得られません。 – andyczerwonka
'142913828922L%(Int.MaxValue.toLong + 1)'は 'sum'バージョンが与える値と等しいことに注意してください。 –