scala中无尾递归优化时的堆栈溢出?

scala中无尾递归优化时的堆栈溢出?,scala,tail-recursion,Scala,Tail Recursion,我自己从scala编译器源代码构建了一个scala编译器。在编译器的源代码中,有许多尾部递归函数/方法。从源代码构建scala编译器还需要编译编译器本身的源代码。如果我在编译源代码期间添加选项-g:notailcalls以关闭尾部递归优化,则在运行构建的编译器时会出现statck溢出错误 一句话,在一个具有许多递归调用的大型复杂scala程序中,在编译时忽略尾部递归优化是否可能导致运行时出现堆栈溢出错误?当然。但是请注意,Scala能够判断函数本身是否是尾部递归的,您不需要向函数传递@tailr

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


一句话,在一个具有许多递归调用的大型复杂scala程序中,在编译时忽略尾部递归优化是否可能导致运行时出现堆栈溢出错误?

当然。但是请注意,Scala能够判断函数本身是否是尾部递归的,您不需要向函数传递
@tailrec
注释


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

当然,您可以选择“是”。关闭尾部递归优化意味着对其他尾部递归函数的递归调用在以前不使用的情况下会消耗堆栈帧,因此占用更多堆栈并使堆栈溢出的可能性更大。它不需要“大而复杂”的程序。试试看:
def(i:Int):Int=if(i==0)i else f(i-1);f(1000000)