现在,我正在尝试学习 Scala 。我从小处着手,编写一些简单的算法。当我想通过查找所有低于某个阈值的素数来实现 Sieve 算法时,我遇到了一些问题。
我的实现是:
import scala.math
object Sieve {
// Returns all prime numbers until maxNum
def getPrimes(maxNum : Int) = {
def sieve(list: List[Int], stop : Int) : List[Int] = {
list match {
case Nil => Nil
case h :: list if h <= stop => h :: sieve(list.filterNot(_ % h == 0), stop)
case _ => list
}
}
val stop : Int = math.sqrt(maxNum).toInt
sieve((2 to maxNum).toList, stop)
}
def main(args: Array[String]) = {
val ap = printf("%d ", (_:Int));
// works
getPrimes(1000).foreach(ap(_))
// works
getPrimes(100000).foreach(ap(_))
// out of memory
getPrimes(1000000).foreach(ap(_))
}
}
不幸的是,当我想计算所有小于 1000000 (100 万) 的素数时,它失败了。我收到 OutOfMemory 。
您对如何优化代码有任何想法,或者我如何以更优雅的方式实现此算法。
PS:我在 Haskell 中做过非常相似的事情,我没有遇到任何问题。