これは、euler プロジェクトの問題 14 の解決策です。
しかし奇妙なことに、val answer が遅延として宣言されていない場合、このプログラムは終了しません。val が遅延している間、解決策は数秒で生成されます。それがなければ、Java VM は長時間 (おそらく永遠に) 100% の CPU 使用率になります。
package euler
object Problem14 {
//Which starting number, under one million, produces the longest chain?
def startingNumbersFrom(n: Long): Stream[Long] = {
if (n == 1)
Stream(1)
else if (n % 2 == 0)
n #:: startingNumbersFrom(n/2)
else
n #:: startingNumbersFrom(3*n+1)
}
//This has to be lazy for program to terminate
lazy val answer = (
for (n <- 1 to 1000000) yield
(n, startingNumbersFrom(n).length)
).maxBy(x=> x._2)._1
def main(args: Array[String]) = {
println(answer)
}
}
直感的に、コンパニオン オブジェクトが init/tear down ループに巻き込まれていると推測できますが、なぜそうなるのかは明らかではありません。