簡體   English   中英

如何使用 Scala 映射的最后一個結果作為下一個函數的輸入?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM