我自己从scala编译器源代码构建一个scala编译器。在编译器的源代码中,有许多尾递归函数/方法。从源代码构建scala编译器还需要编译编译器本身的源代码。如果在编译源代码期间添加选项-g:notailcalls
以关闭尾递归优化,则在运行构建的编译器时将出现statck溢出错误。
总之,有可能在一个大而复杂的scala程序中有很多递归调用,在编译时忽略尾递归优化会导致运行时堆栈溢出错误吗?
答案 0 :(得分:2)
当然可以。但是请注意Scala能够确定函数是否是尾递归的,你不需要将@tailrec
注释传递给函数。
但是,scala无法将合适的函数转换为其尾递归形式。你必须手动完成,但不是每个函数都可以这样转换。