【发布时间】:2015-12-04 21:44:28
【问题描述】:
问题:
我需要创建一个 Scala 程序,它使用 Stream 类并从区间 [i, j] 中找到第 n 个素数(而 1
更多信息:
我是 Scala 的新手,但我已经寻找了有关如何使用 Stream 在 Scala 中查找素数的各种示例。他们都没有帮助我实现我的目标。
我似乎无法理解如何使流成为区间 [i, j] 中的有限列表以及如何从该区间中获取第 n 个素数。
到目前为止我的代码:
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
【问题讨论】:
-
为什么
primeStream带args参数? -
我从控制台运行这个脚本并将 3 个参数传递给
args数组。 -
我只是想让您了解一个事实,即在您的示例中,参数在单行
primeStream方法中没有任何作用:它只是不断传递,因此完全没用. -
哦!你是对的。我正在努力通过任何方式让它工作。
标签: scala stream functional-programming primes