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



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

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

当然可以。但是请注意Scala能够自己判断函数是否是尾部递归的,你不需要传递@tailrec注释给函数。

然而,scala无法将合适的函数转换为尾递归形式。您必须手动执行此操作,但并非每个函数都可以以这种方式转换。

最新更新