Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala可以为相互调用的不同方法执行尾部递归吗?_Scala_Recursion_Tail Recursion_Tail Call Optimization - Fatal编程技术网

Scala可以为相互调用的不同方法执行尾部递归吗?

Scala可以为相互调用的不同方法执行尾部递归吗?,scala,recursion,tail-recursion,tail-call-optimization,Scala,Recursion,Tail Recursion,Tail Call Optimization,我正在用分层数据结构做一些事情,我设计了一组方法,用间接递归遍历/分析它,如下所述 有方法a、b、c和d,所有这些方法都具有单元返回类型。首先调用方法a。根据数据,它将执行某些操作,然后停止或调用b/c/d中的一个。b、c和d中的每一个都是一样的——每个方法都可以暂停或调用其他3个方法中的任何一个。因此,调用哪些方法以及它们的执行顺序在运行时之前都是未知的,递归并不明显,因为没有方法直接调用自己(不要担心,每个方法都会被注释以描述调用的循环/递归性质) 对a、b、c或d的每次额外调用都是每个方法

我正在用分层数据结构做一些事情,我设计了一组方法,用间接递归遍历/分析它,如下所述

有方法
a
b
c
d
,所有这些方法都具有
单元
返回类型。首先调用方法
a
。根据数据,它将执行某些操作,然后停止或调用
b/c/d
中的一个。b、c和d中的每一个都是一样的——每个方法都可以暂停或调用其他3个方法中的任何一个。因此,调用哪些方法以及它们的执行顺序在运行时之前都是未知的,递归并不明显,因为没有方法直接调用自己(不要担心,每个方法都会被注释以描述调用的循环/递归性质)

a
b
c
d
的每次额外调用都是每个方法中执行的最后一件事,但它并不是每个方法的最后一条语句;将有一个
if
case
语句来控制调用哪个语句


如果没有方法直接调用自己,Scala编译器是否能够分析这个多层调用链并为其实现尾部递归?

否,Scala无法执行这种尾部调用优化;JVM并没有真正做到这一点(或者至少不容易做到)


不过,您可以通过编写一个函数来模拟它,该函数可以根据参数采用四种不同的路径。(如果编译器要帮你,它就必须这样做。)

不,Scala无法执行那种尾部调用优化;JVM并没有真正做到这一点(或者至少不容易做到)


不过,您可以通过编写一个函数来模拟它,该函数可以根据参数采用四种不同的路径。(如果编译器要帮助您,它就必须这样做。)

尽管编译器不能自动为您这样做,但您的用例应该适合使用


这将不会有很好的性能,如果您的调用只有4个深度,这可能不值得。

虽然编译器不能自动为您完成这项工作,但您的用例应该可以使用


但是,这样做的性能不太好,如果您的调用只有4个深度,那么这可能不值得。

按照这些思路,我考虑让每个方法返回要执行的下一个方法(如函数编程),而不是直接调用下一个方法并返回
单元。然后一个更高级别的方法将执行下一个方法,因此可以完全避免递归。@Gigatron-这与
scala.util.control.TailCalls
所做的差不多。根据这些思路,我正在考虑让每个方法返回下一个要执行的方法(如函数式编程),而不是直接调用下一个方法并返回
Unit
。然后一个更高级别的方法将执行下一个方法,因此可以完全避免递归。@Gigatron-这与
scala.util.control.TailCalls
所做的差不多。它不仅有4个深度,还有任意数量的深度。当a调用b时,b可以调用c,c再次调用a,然后调用d,在数据被遍历时调用a,依此类推。是我,还是你链接到的站点真的缓慢加载?它不仅仅是4级,而是任意级别的深度。当a调用b时,b可以调用c,c再次调用a,然后调用d,在数据被遍历时调用a,依此类推。是我,还是你链接的站点真的缓慢加载?