5
object E7 {
  def next_prime(primes: List[Int]) = primes match {
    case ps@(h :: t) => {


      // Version 1
      val rpq = ps.reverse.exists _

      // Version 2
      val rpq = ps.reverse.exists(_)


      (Iterator.from(h + 1).find((v) => ! rpq(v % _ == 0)): @unchecked) match {
        case Some(v) => v :: ps
      }
    }
    case Nil    => List(2)
  }

  val primes = Iterator.iterate(List[Int]())(next_prime)

  def main(args: Array[String]) {
    println(primes.drop(20001).next.head)
  }
}

第一个版本需要 3.6 秒才能完成,第二个 - 19.3 秒!有什么不同?

编辑:Scala 版本 2.9.2(Java HotSpot(TM) 64 位服务器 VM,Java 1.7.0_21)

4

1 回答 1

4

第一个被解释为

{ val temp = ps.reverse; (x: Int) => temp.exists(x) }

而第二个被解释为

(x: Int) => ps.reverse.exists(x)

这就解释了差异:在第二种情况下,您必须每次都反转,但在第一种情况下只能反转一次。我不确定规范中的哪个位置说这是您在每种情况下得到的(或者如果确实如此)。

于 2013-05-30T18:19:23.907 回答