2012-03-15 72 views
1

我做一个分层数据结构的东西,我已经设计了一个组的方法来遍历/如下所述与间接递归分析它。Scala可以为不同的方法调用对方的尾递归吗?

有方法abcd,都带有Unit返回类型。首先调用方法a。根据数据,它会做一些事情,然后停止或拨打b/c/d之一。 b,c和d中的每一个都是一样的 - 每种方法可以暂停或者调用其他3种方法中的任何一种。那么,哪些方法被调用,其执行的顺序是未知的,直到运行时和递归是没有直接明显的,因为没有一种方法是直接调用自己(不要担心,每个方法将注释来描述的循环/递归特性调用)。

每个额外调用abc,或d在每个方法执行的最后一件事,但它不是字面上每个方法的最后陈述;将会有一个ifcase语句来控制哪一个将被调用。

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

回答

4

没有,Scala是无法执行,诸如此类的尾调用优化; JVM并没有真正做到这一点(或者至少不容易)。

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

+0

沿着那些我在想使每一个方法返回要执行的下一个方法(如函数式编程),而不是直接调用下一个方法,并返回'Unit'线。然后更高级别的方法将执行下一个方法,因此可以完全避免递归。 – Gigatron 2012-03-16 00:00:19

+0

@Gigatron - 这几乎是'scala.util.control.TailCalls'的功能。 – 2012-03-16 16:16:52

1

尽管编译器不能为你做自动,您的使用情况应该是适合使用scala.util.control.TailCalls

虽然这不会很高效,但如果您的电话只有四个电话,那可能不值得。

+0

这不只是4深,这是深层次的任意数量。当一个呼叫B,B可以调用C再次调用,然后调用d它调用回等作为数据被遍历。 – Gigatron 2012-03-16 12:03:39

+0

它只是我,还是你链接到真正懒惰加载的网站? – Gigatron 2012-03-16 12:06:20

相关问题