[英]How can I use the last result from a scala map as input to the next function?
我正在解決一些項目 euler 問題來練習我的 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.