1

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

有方法a, b,cd, 都有一个Unit返回类型。a首先调用方法。根据数据,它会做一些事情,然后停止或调用其中之一b/c/d。b、c 和 d 中的每一个都相同——每个方法都可以停止或调用其他 3 个方法中的任何一个。所以调用了哪些方法,它们的执行顺序直到运行时才知道,并且递归并不直接明显,因为没有方法直接调用自己(不用担心,每个方法都会被注释以描述循环/递归的性质来电)。

a对、bc或的每次额外调用d都是每个方法中执行的最后一件事,但它并不是每个方法的最后一条语句;将有一个iforcase语句来控制将调用哪个语句。

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

4

2 回答 2

4

不,Scala 无法执行那种尾调用优化;JVM 并没有真正使这成为可能(或者至少不容易)。

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

于 2012-03-15T19:34:29.970 回答
1

尽管编译器无法自动为您执行此操作,但您的用例应该可以使用scala.util.control.TailCalls.

不过,这不会很高效,如果你的电话只有 4 深,那可能不值得。

于 2012-03-16T05:51:59.673 回答