【发布时间】:2010-12-26 14:56:48
【问题描述】:
我在下面使用 Stream 和惰性 val 编写了惰性筛算法的以下实现:
def primes(): Stream[Int] = {
lazy val ps = 2 #:: sieve(3)
def sieve(p: Int): Stream[Int] = {
p #:: sieve(
Stream.from(p + 2, 2).
find(i=> ps.takeWhile(j => j * j <= i).
forall(i % _ > 0)).get)
}
ps
}
以及使用(可变)ListBuffer的以下实现:
import scala.collection.mutable.ListBuffer
def primes(): Stream[Int] = {
def sieve(p: Int, ps: ListBuffer[Int]): Stream[Int] = {
p #:: { val nextprime =
Stream.from(p + 2, 2).
find(i=> ps.takeWhile(j => j * j <= i).
forall(i % _ > 0)).get
sieve(nextprime, ps += nextprime)
}
}
sieve(3, ListBuffer(3))}
当我做 primes().takeWhile(_
我编辑了第二个版本:它应该是 sieve(3, ListBuffer(3)) 而不是 sieve(3, ListBuffer()) 。
【问题讨论】:
-
第二个版本说 9, 15, 21, 27 ... 是素数...
-
对不起,我的错。我编辑了第二个版本的最后一行:
-
我假设 second 实现比第一个快三倍?你说第一个实现比第一个实现快,这没有任何意义。 :-)
-
另一个错误,对不起。第一个比第二个快三倍。
-
嗯嗯。我在这里得到类似 1312 vs 1478 的结果,而不是三倍。然而,我预计第二个版本会更快.... scala 版本、编译器标志、jvm 标志、jre 版本、架构等是什么?
标签: scala stream listbuffer