scala - 如何使用 scala 映射的最后结果作为下一个函数的输入?

标签 scala

我正在解决一些项目欧拉问题来练习我的 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/

相关文章:

scala - 为什么 Haskell 的 foldr 不是 stackoverflow 而相同的 Scala 实现呢?

Scala3 对基本类型和覆盖的扩展 ==

scala - 在映射中查找其值满足函数的键

scala - SBT/Scala : macro implementation not found

scala - 测试所有类型的通用空值

scala - 如何在测试规范中修复参数ta缺少的隐式值:TildeArrow

java - Scala 的内部类和 Java 的内部/嵌套类有什么区别?

scala - 使用Spark检索聚集/存储桶

mongodb - 使用 ReactiveMongo 处理来自上限集合的作业直到被中断

scala - Hadoop 作业在 java.lang.ClassNotFoundException 上失败