Scala中的非尾部递归有多有用?

Scala中的非尾部递归有多有用?,scala,recursion,tail-recursion,Scala,Recursion,Tail Recursion,因为非尾部递归调用像Java一样使用堆栈帧,所以我会厌倦任何超过1000次的递归。因此,我会厌倦在大多数事情上使用它 人们真的在Scala中使用非尾部递归吗?如果是,我可以使用什么标准来确定它是否可以是非尾部递归的 此外,是否有计划在Scala的未来版本中删除此内存限制?在无法使用单尾递归的情况下,例如,因为需要在两个函数之间进行替换,因此描述了一种称为的机制 鲁纳尔·比亚纳森(Rúnar Bjarnason)的论文对这一主题进行了更为深入的讨论 就我个人而言,如果你真的遇到深度大于1K的情况,

因为非尾部递归调用像Java一样使用堆栈帧,所以我会厌倦任何超过1000次的递归。因此,我会厌倦在大多数事情上使用它

人们真的在Scala中使用非尾部递归吗?如果是,我可以使用什么标准来确定它是否可以是非尾部递归的


此外,是否有计划在Scala的未来版本中删除此内存限制?

在无法使用单尾递归的情况下,例如,因为需要在两个函数之间进行替换,因此描述了一种称为的机制

鲁纳尔·比亚纳森(Rúnar Bjarnason)的论文对这一主题进行了更为深入的讨论


就我个人而言,如果你真的遇到深度大于1K的情况,我会选择简单的方法,恢复到命令式风格,例如使用可变集合生成器。

在很多情况下,关于域的事实意味着堆栈上的递归不太可能成问题。以UI菜单树为例,如果它的深度足以溢出堆栈,那么无论如何,您的程序有更严重的问题。“另外,是否有计划在未来版本的Scala中删除此内存限制?”这不是语言版本问题。如果编写的调用不是尾部调用(递归或非递归),则需要堆栈帧(以保持状态,使非尾部调用返回后的计算继续)。Java和大多数其他语言也是如此。@Paul:不过,即使JVM仍然有堆负载可用,您也很容易耗尽堆栈,这是当前实现的一个假象,对吗?至少在理论上,Scala编译器可以通过使用堆而不是堆栈来保存状态的方式编译调用?是的,这就是为什么我说“大多数语言”。有一些语言可以做到这一点(例如,我相信scheme和call/cc),但开销很大。我们一直使用堆栈而不是堆的原因是分配和释放的效率。不过,我看不到Scala(或任何主流语言)在允许无限递归的正常调用中受到性能影响。这里的问题几乎相同: