Прямо сейчас я пытаюсь выучить 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 (1 миллион). Я получаю OutOfMemory.
Есть ли у вас какие-либо идеи о том, как оптимизировать код или как я могу реализовать этот алгоритм более изящно.
PS: я сделал что-то очень похожее на Haskell, и там я не столкнулся с какими-либо проблемами.