2011-02-28 39 views
1

http://pavelfatin.com/scala-for-project-euler/看着歐拉項目的解決方案,我對「問題10 」的解決方案如何發揮作用感到有點困惑。計算所有的總和低於200萬的素數。「euler project sum-of-primes和Stream.view

提出的解決方案是:

lazy val ps: Stream[Int] = 2 #:: ps.map(i => Stream.from(i + 1).find(
    j => ps.takeWhile(k => k * k <= j).forall(j % _ > 0)).get) 
val r = ps.view.takeWhile(_ < 2000000).foldLeft(0L)(_ + _) 

...這會導致142913828922

我注意到你得到一個不同的結果,1179908154,如果你離開了看法:

val r = ps.takeWhile(_ < 2000000).foldLeft(0L)(_ + _) 

有人可以向我解釋爲什麼這些不同嗎?

+0

我想這是一個錯誤...似乎流是一個「高維護日期」。 – 2011-02-28 01:22:22

+0

scala版本是什麼?我在2.8.0和2.8.1中獲得了142913828922的視圖和非視圖版本... – huynhjl 2011-02-28 02:56:49

+0

$ scala -version Scala代碼運行器版本2.8.1.final - Copyright 2002-2010,LAMP/EPFL $ java -version Java版本「1.6.0_22」 Java™SE運行時環境(版本1.6.0_22-b04-307-10M3261) Java HotSpot™64位服務器VM(版本17.1-b03-307,混合模式) – 2011-02-28 07:13:36

回答

0
Welcome to Scala version 2.8.1.final (Java HotSpot(TM) Client VM, Java 1.6.0_24). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> lazy val ps: Stream[Int] = 2 #:: ps.map(i => Stream.from(i + 1).find(
    |  j => ps.takeWhile(k => k * k <= j).forall(j % _ > 0)).get) 
ps: Stream[Int] = <lazy> 

scala> val r = ps.view.takeWhile(_ < 2000000).foldLeft(0L)(_ + _) 
r: Long = 142913828922 

scala> val r = ps.takeWhile(_ < 2000000).foldLeft(0L)(_ + _) 
r: Long = 142913828922 
+0

謝謝......在我上面的評論中,我表示這個消失了一個新的repl,顯然這是一個難以重現的repl或scala錯誤。 – 2011-04-07 08:12:47

相關問題