【发布时间】:2017-09-03 17:31:36
【问题描述】:
在 Scala 中检查 n 是否为素数时,最常见的解决方案是简洁的单行,几乎可以在所有类似的 SO 问题中看到
def isPrime1(n: Int) = (n > 1) && ((2 until n) forall (n % _ != 0))
继续,重写它以仅检查奇数很简单
def isPrime2(n: Int): Boolean = {
if (n < 2) return false
if (n == 2) return true
if (n % 2 == 0) false
else (3 until n by 2) forall (n % _ != 0)
}
但是,为了提高效率,我想将仅检查赔率与计数到 sqrt(n) 结合起来,但不使用 Math.sqrt。所以,作为i < sqrt(n) <==> i * i < n,我会编写类似C的循环:
def isPrime3(n: Int): Boolean = {
if (n < 2) return false
if (n == 2) return true
if (n % 2 == 0) return false
var i = 3
while (i * i <= n) {
if (n % i == 0) return false
i += 2
}
true
}
问题是:
1) 如何在第一个版本中实现最后一个版本漂亮的Scala函数风格?
2) 我怎样才能使用 Scala for 呢?我想到了类似下面的东西,但不知道如何。
for {
i <- 3 until n by 2
if i * i <= n
} { ??? }
【问题讨论】:
-
您的问题不清楚。 “没有任何库”是什么意思?在您的
isPrime3中,您使用了库中的 2 个类和 6 个方法,而在您的for理解中,您至少使用了 3 个类和 6 个方法。既然您自己使用库没有问题,那么“没有任何库”究竟是什么意思? -
好的,只是没有计算
sqrt是清楚的——我只想对整数进行操作。我改变了问题的主题。
标签: scala functional-programming primes for-comprehension