3

Scala 2.10.3 でこのプログラムを実行しています。

object Test {
  def main(args: Array[String]) { 
    def factorial(x: BigInt): BigInt = 
      if (x == 0) 1 else x * factorial(x - 1)

    val N = 1000
    val t = new Array[Long](N)
    var r: BigInt = 0

    for (i <- 0 until N) {
      val t0 = System.nanoTime()

      r = r + factorial(300)
      t(i) = System.nanoTime()-t0
    }

    val ts = t.sortWith((x, y) => x < y)

    for (i <- 0 to 10)
      print(ts(i) + "  ")

    println("***  " + ts(N/2) + "\n" + r)
  }  
}

定数引数を持つ純粋な関数の呼び出しは、factorial各ループ反復中に評価されます (タイミング結果に基づく結論)。オプティマイザーは、最初の呼び出しの後に関数呼び出しの結果を再利用すべきではありませんか?

私はEclipse用のScala IDEを使用しています。より効率的なコードを生成するコンパイラの最適化フラグはありますか?

4

1 に答える 1

6

Scala は純粋な関数型言語ではないため、効果システムがなければそれfactorialが純粋であることを認識できません (たとえば、big int の乗算については何も「認識」しません)。

ここに独自のメモ化アプローチを追加する必要があります。ほとんどの場合val f300 = factorial(300)、ループの外側に追加するだけです。


メモ化についての質問です。

于 2013-10-11T10:59:57.133 に答える