【发布时间】:2015-11-30 05:05:31
【问题描述】:
我正在自己从 scala 编译器源代码构建一个 scala 编译器。在编译器的源代码中,有很多尾递归函数/方法。从源代码构建 scala 编译器也需要编译编译器本身的源代码。如果我在编译源代码的时候加上选项-g:notailcalls关闭尾递归优化,运行编译好的编译器会出现statck溢出错误。
总之,在一个庞大而复杂的scala程序中,有很多递归调用,编译时忽略尾递归优化会导致运行时堆栈溢出错误吗?
【问题讨论】:
-
当然可以查看issues
-
是的,当然。关闭尾递归优化意味着对其他尾递归函数的递归调用会消耗之前没有的堆栈帧,因此占用更多堆栈并更有可能导致堆栈溢出。
-
它不需要“大而复杂”的程序。试试看:
def f(i: Int): Int = if (i == 0) i else f(i - 1); f(1000000)
标签: scala tail-recursion