作为一名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