在scala中没有尾递归优化时堆栈溢出?

时间:2015-09-04 06:16:58

标签: scala tail-recursion

我自己从scala编译器源代码构建一个scala编译器。在编译器的源代码中,有许多尾递归函数/方法。从源代码构建scala编译器还需要编译编译器本身的源代码。如果在编译源代码期间添加选项-g:notailcalls以关闭尾递归优化,则在运行构建的编译器时将出现statck溢出错误。

总之,有可能在一个大而复杂的scala程序中有很多递归调用,在编译时忽略尾递归优化会导致运行时堆栈溢出错误吗?

1 个答案:

答案 0 :(得分:2)

当然可以。但是请注意Scala能够确定函数是否是尾递归的,你不需要将@tailrec注释传递给函数。

但是,scala无法将合适的函数转换为其尾递归形式。你必须手动完成,但不是每个函数都可以这样转换。