【发布时间】:2012-07-26 00:56:46
【问题描述】:
作为 Scala 新手,我正在阅读书籍、文档并尝试解决在 http://aperiodic.net/phil/scala/s-99/ 上发现的问题。似乎正确的 Scala 代码基于不可变值 (val) 和递归而不是循环和变量,以使并行性更安全并避免使用锁。
例如,练习 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),您'会看到使用了循环和变量。
我的问题是如何管理促进 vals 和递归的 Scala 学习内容的影响,因为知道此类代码可能会因递归次数而中断?
【问题讨论】:
-
Scala 编译器足够聪明,可以在trampoolined 尾递归中编译尾递归调用(JVM 不支持 TCE),这不会导致 stackoveflow。如果您想确定您的代码是尾递归的,请在方法签名中添加 @tailrec 注释
标签: scala recursion stack-overflow