这是欧拉项目第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 循环,但不清楚为什么会发生这种情况。