作爲一名Scala新手,我正在閱讀書籍,文檔並嘗試解決http://aperiodic.net/phil/scala/s-99/上發現的問題。看起來正確Scala代碼基於不可變值(val)和遞歸,而不是循環和變量,以便使並行性更安全並避免使用鎖。Scala新手:遞歸和stackoverflow錯誤
例如,對於鍛鍊P22一個可能的解決方案(http://aperiodic.net/phil/scala/s-99/p22.scala)是:
// Recursive.
def rangeRecursive(start: Int, end: Int): List[Int] =
if (end < start) Nil
else start :: rangeRecursive(start + 1, end)
當然這個代碼是緊湊,看起來聰明,但,當然,如果遞歸的數量很多,你會面對一個StackOverflow錯誤(rangeRecusrsive(1,10000),例如沒有JVM調優)。如果您查看List.range(https://github.com/scala/scala/blob/v2.9.2/src/library/scala/collection/immutable/List.scala#L1)中內置的源代碼,您會看到使用循環和變量。
我的問題是如何管理Scala學習東西的影響,它促進vals和遞歸,知道這樣的代碼可能因遞歸次數而中斷?
Scala編譯器足夠聰明,可以在[trampoolined](http://blog.richdougherty.com/2009/04/tail-calls-tailrec-and-trampolines.html)尾遞歸(JVM)中編譯尾遞歸調用不支持TCE),這不會導致stackoveflow。如果你想確定,你的代碼是尾遞歸的,添加@tailrec註釋到方法簽名 – 2012-07-27 10:53:14