【发布时间】:2011-05-30 04:42:35
【问题描述】:
我正在尝试在 Scala 中实现 Sieve of 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 函数,我正在尝试掌握如何使用它,因为我怀疑它可能在这种情况下有用......
【问题讨论】:
-
要在纯函数式语言中执行此操作,您将使用函数递归。
标签: scala functional-programming iterator sieve-of-eratosthenes