我正在尝试在 Scala中实现Eratosthenes 筛。
我首先初始化所有奇数加 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
}
但是,当然,这只是将序列复制到一个迭代器中,然后像 for 循环开始时那样迭代每个值nums
(因此在这种情况下,它与前面的示例完全相同)。我希望它每次迭代都能从nums
.
实现这一点的最佳方法是什么?我应该使用索引变量和while循环吗?我不确定如何从序列中获取元素(即如何获取序列的元素 x,其中 x 是索引)。或者有没有更实用的方法来做到这一点?
编辑:我刚刚找到了这个scanLeft
功能,我正在尝试掌握如何使用它,因为我怀疑它可能在这种情况下有用......