Я пытаюсь реализовать Решето Эратосфена в Scala.
Я начинаю с инициализации последовательности всех нечетных чисел плюс 2:
// (end goal is to find all prime factors of bigNumber)
val largestPrime : Long = Math.ceil(Math.sqrt(bigNumber)).toLong
var nums : Seq[Long] = (3L to largestPrime by 2L).toSeq
nums +: 2L
Теперь nums
содержит Seq( 2,3,5,7,9,11,13,15,...,(largestPrime) ). Затем с помощью решета я хочу перебрать каждый элемент и отфильтровать все кратные этому элементу из Seq. Это будет выглядеть примерно так, за исключением того, что это просто перебирает каждое нечетное число:
for(i : Long <- 3L to largestPrime by 2L) {
nums = nums.filter((j : Long) => j == i || j % i != 0)
}
Поэтому вместо этого я хотел бы использовать что-то вроде этого:
for(i <- nums) {
// filter
}
Но, конечно, это просто копирует последовательность в итератор, а затем выполняет итерацию по каждому значению в nums
, как это было в начале цикла for (так что в этом случае это точно эквивалентно предыдущему примеру). Я хочу, чтобы на каждой итерации получалось следующее значение из nums
.
Как лучше всего это реализовать? Должен ли я использовать индексную переменную и цикл while? Я не уверен, как получить элемент из последовательности (т.е. как получить элемент x последовательности, где x - индекс). Или есть более функциональный способ сделать это?
Редактировать: я только что нашел функцию scanLeft
, я пытаюсь понять, как ее использовать, поскольку я подозреваю, что она может быть полезна в этом случае...