这个问题涉及到euler项目的素数和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,但事实并非如此.即使我用a实现了Stream toList(),我也有同样的差异.这些方法应该给出相同的结果是不正确的假设吗?
我正在使用Scala 2.9.1.final.
Owe*_*wen 12
问题似乎是溢出.这些给我的结果相同:
(primes map (_.longValue) takeWhile (_ < 2000000)).sum
(primes map (_.longValue) takeWhile (_ < 2000000)).foldLeft(0L)(_ + _)
我想之间的差sum和foldLeft是的结果类型sum是相同的被求和(所要求的元件的类型数值的性状),但foldLeft可以有不同的结果类型,它可以通过编写实现0L.
| 归档时间: | 
 | 
| 查看次数: | 838 次 | 
| 最近记录: |