我使用下面的 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(_ < 1000000).size 时,第一个实现比第二个快 3 倍。对此有何解释?
我编辑了第二个版本:它应该是 sieve(3, ListBuffer(3)) 而不是 sieve(3, ListBuffer()) 。