【发布时间】:2012-01-18 02:13:07
【问题描述】:
这个问题与euler project sum-of-primes, and Stream.view 相关,但有一点不同。我想计算所有低于 200 万的素数之和。我创建了一个素数生成器,定义为:
lazy val primes: Stream[Int] = 2 #:: Stream.from(3).filter(i =>
primes.takeWhile(j => j * j <= i).forall(i % _ > 0))
我写了两个测试,一个使用 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 给了我正确的答案,而testEuler010b 没有给我1179908154 的答案。我希望Stream[Int]#foldLeft(0L)(_ + _) 与Stream[Int].sum 相同,但事实并非如此。即使我用toList() 实现流,我也会得到同样的差异。这些方法应该给出相同的结果是错误的假设吗?
我正在使用 Scala 2.9.1.final。
【问题讨论】:
-
我不需要使用
view。在这种情况下,性能没有提高,我也没有得到不同的结果。 -
请注意
142913828922L % (Int.MaxValue.toLong + 1)等于sum版本给出的值。
标签: scala