【发布时间】:2014-08-28 01:52:50
【问题描述】:
下面的简单函数是尾递归的。但是,它仍然会抛出 java.lang.StackOverflowError。谁能帮我理解我为什么会得到这个?
我已经尝试使用包含数百万项列表的尾递归函数,但从未得到StackOverflowError。还是这个函数不是尾递归的?
def recursion(i: Int): Int = {
if (i == 20000) i
else {
recursion(i + 1)
}
}
recursion(0)
更新:添加@tailrec 确实可以解决问题,即使我将限制增加到 2147483647。感谢@tiran 的回答
【问题讨论】:
-
您可以通过在函数中添加
@tailrec注解来检查尾递归。这是尾递归,不会为我抛出 SOE。 -
这是尾递归,但您是否可能在您的 REPL 会话/其他地方有另一个名为
recursion的函数覆盖此函数? -
感谢您的建议。我创建了一个只有一个函数的测试应用程序,它称为递归。在函数中添加@tailrec 确实解决了这个问题。谢谢蒂兰
-
实际上添加
@tailrec并不能解决问题,因为它只是一个告诉编译器I think this function is tailrecursive, but check it and tell me if it's differently的注解。 -
@SamVo 改写 goral - 它不告诉编译器执行 TCO(尾调用优化),这将在有和没有注释的情况下完成,而是告诉编译失败以防万一不可能执行。
标签: scala tail-recursion stack-overflow