我正在解决一些项目欧拉问题来练习我的 scala。对于问题 7,我必须找到第 10001 个素数。我有一个可行的解决方案,但感觉它的功能还不够。
def first_n_primes(n: Long) : List[Long] = {
var last_prime = 1L
(1L to n).map(x => {last_prime = get_next_prime(x, last_prime); last_prime}).toList
}
具体来说,我觉得可能有一种方法可以摆脱 var last_prime,但我不知道如何使用第 n 次映射评估的结果作为第 n+1 次评估的输入。我怎样才能更有效地做到这一点?
最佳答案
您正在寻找scanLeft
:
(1l to n).scanLeft(1) { case (x, last) => get_next_prime(x, last) }
或者只是(1l to n).scanLeft(1)(get_next_prime)
但请注意,这不是一个很好的查找素数的算法,因为可以节省大量重复工作(要找到下一个素数,您需要重新发现所有以前的素数)。
这种任务最好在 scala 中使用递归流来完成:
lazy val primes: Stream[Long] = 2 #:: Stream.iterate(3l)(_+1).filter { n =>
val stop = math.sqrt(n)
primes.takeWhile { _ <= stop }.forall { k => n % k != 0 }
}
primes.take(n).toList
关于scala - 如何使用 scala 映射的最后结果作为下一个函数的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55298939/