Scala流以查找特定间隔内的素数

Scala流以查找特定间隔内的素数,scala,stream,functional-programming,primes,Scala,Stream,Functional Programming,Primes,问题: def primeStream(args: Array[String], s: Stream[Int]): Stream[Int] = Stream.cons(s.head, primeStream(args,s.tail filter {_ % s.head != 0 })) if (args(0).toInt < 1) { println("Entered parameter i does not meet requirements 1<

问题:

def primeStream(args: Array[String], s: Stream[Int]): Stream[Int] =
        Stream.cons(s.head, primeStream(args,s.tail filter {_ % s.head != 0 }))

if (args(0).toInt < 1) {
        println("Entered parameter i does not meet requirements 1<=i<j (1<=" + args(0) + "<" + args(1) + ")")
        sys.exit(1)
} else if (args(1).toInt < args(0).toInt) {
        println("Entered parameter j does not meet requirements 1<=i<j (1<=" + args(0) + "<" + args(1) + ")")
        sys.exit(1)
}

val primes = primeStream(args,Stream.from(args(0).toInt)) // start from i element

primes take args(1).toInt foreach println //Take j elements
def primeStream(s: Stream[Int]): Stream[Int] =
        Stream.cons(s.head, primeStream(s.tail filter {_ % s.head != 0 }))

if (args(0).toInt < 1) {
        println("Entered parameter i does not meet requirements 1<=i<j (1<=" + args(0) + "<" + args(1) + ")")
        sys.exit(1)
} else if (args(1).toInt < args(0).toInt) {
        println("Entered parameter j does not meet requirements 1<=i<j (1<=" + args(0) + "<" + args(1) + ")")
        sys.exit(1)
} else if (args(0).toInt == 1) {
        println("1 is not a prime by definition!") 
        sys.exit(1)  // if args(0) is 1 then function hangs up - didn't come up with a better solution for this
}

val primes = primeStream(Stream.from(args(0).toInt)) // get primes starting from given parameter

println(primes.takeWhile( _ < args(1).toInt).take(args(2).toInt).last) // get n-th prime and print it out

我需要创建一个Scala程序,它使用Stream类并从区间[I,j]中查找第n个素数(而1您只需要让流在特定条件保持时生成值:

primes takeWhile(_ < j) take n foreach println
primes takeWhile(j
当然,您需要正确使用
primeStream
函数

对于算法部分,您最好搜索stackoverflow:


这是一个学习练习,还是你在生产中需要这个?对于后者,我建议使用库中的spire.math.prime.stream。它使用的是Eratosthenes实现的分段流,可能比你在短时间内想到的要好。它还使用任意精度的整数,因此大于2^64的数字的rks

scala> import spire.math._
import spire.math._

scala> prime.stream.drop(10).take(10).toArray
res16: Array[spire.math.SafeLong] = Array(31, 37, 41, 43, 47, 53, 59, 61, 67, 71)

为什么
primeStream
接受
args
参数?我从控制台运行此脚本,并将3个参数传递到
args
数组中。我只是想让您了解一个事实,即在您的示例中,参数在这一行
primeStream
方法中没有任何作用:它只是一次又一次地传递,因此完全没有作用没用。哦!你说得对。我一直在努力让它以任何方式工作。谢谢!现在这给了我间隔[I;j],我应该从中获取特定的第n个元素。我如何获取这个第n个元素?我假设,我传递了3个参数:I j kYou需要获取结果流中的最后一个元素,即,
primes takeWhile(j)拿n last来说,我现在觉得有点傻。为什么是last?例如,我有一个间隔
[2;13]
中的素数列表,我想取第5(n)个元素,即11[2,3,5,7,11,13]。我如何检查11是第5个元素?它是在你使用
n
元素后得到的
最后一个
。不,我不能让它工作。如果我这样运行:
primes takeWhile(
则会出现一个警告,说明“有一个功能警告;重新使用-feature运行以获取详细信息”。如果我这样做:
primes takeWhile(
则显示错误“Int不带参数”。请您详细说明一下好吗?是的,这是一个学习练习。非常感谢您的评论-它看起来确实更简单更好,但我会继续我的解决方案。我发现一个问题,如果我将间隔从
[2,…]
更改为大于2的值,例如
[20,30]
并执行
scala prime.scala 20 30 2
它返回21,但应该返回29,因为它是此特定间隔内的第二个prime。我尝试使用
takeWhile
进行操作以获得所需的结果,但到目前为止没有运气。为了实现这一点,我应该在程序中更改哪些内容?您能提供帮助吗?