【发布时间】:2011-08-25 17:05:07
【问题描述】:
在阅读 David Pollack 的 Begging Scala 时,我对 Scala 有点陌生。 他定义了一个简单的递归函数,从文件中加载所有字符串:
def allStrings(expr: => String): List[String] = expr match {
case null => Nil
case w => w :: allStrings(expr)
}
它很优雅而且很棒,只是当我尝试加载一个巨大的字典文件时它抛出了 StackOverflow 异常。
现在据我了解 Scala 支持尾递归,因此函数调用不可能溢出堆栈,可能编译器无法识别它?因此,经过一番谷歌搜索后,我尝试使用 @tailrec 注释来帮助编译器,但它说
error: could not optimize @tailrec annotated method: it contains a recursive call not in tail position
def allStrings(expr: => String): List[String] =
我对尾递归的理解有误吗?如何修复此代码?
【问题讨论】:
标签: scala functional-programming tail-recursion