Scala 一个懒惰的val可以是递归的吗?
我们可以递归地调用tail上面的表达式吗 你可以问回复人:Scala 一个懒惰的val可以是递归的吗?,scala,tail-recursion,Scala,Tail Recursion,我们可以递归地调用tail上面的表达式吗 你可以问回复人: lazy val seq: Unit = { println("a") seq } 您的val定义不需要在堆栈上,因为没有任何操作需要与堆栈过程中累积的部分结果相结合。我想您可以从这个意义上说,是的-在计算时,seq将递归地计算自身,其评估是执行的最后一个操作 不过,不管这是否可以称为尾部递归,这似乎没有什么意义。没有退出条件,如果您试图保持代码完全正常运行,也不会有退出条件:没有参数,这意味着没有“状态”可以传递给更深入的求
lazy val seq: Unit = {
println("a")
seq
}
您的
val
定义不需要在堆栈上,因为没有任何操作需要与堆栈过程中累积的部分结果相结合。我想您可以从这个意义上说,是的-在计算时,seq
将递归地计算自身,其评估是执行的最后一个操作
不过,不管这是否可以称为尾部递归,这似乎没有什么意义。没有退出条件,如果您试图保持代码完全正常运行,也不会有退出条件:没有参数,这意味着没有“状态”可以传递给更深入的求值,也没有任何可以测试的条件来破坏递归
此外,如果它确实是尾部递归,那么它不是Scala认可或支持的尾部递归形式-evaluate
seq
,您会得到一个stackoverflowerrror
在惰性val上应用@tailrec
在Scala 2.11.1中不起作用。我得到了以下警告:没有对lazy value seq进行注释的有效目标-它被丢弃未使用。这是有意义的,因为正如您所指出的tailrec
实际上只在def
s上工作,无论如何,我在Scala 2.10.4上测试了上述代码。@GabrielePetronella我试图定义一个非尾部递归val,所以:@tailrec lazy val seq:Int={println(“a”);1+seq}
我得到了这个错误:10:error:lazy VAL不是tailcall转换的
,但它适用于tail递归VAL(即使它没有真正应用).嘿,我想你说的是scala中的尾部递归优化。你认为我提到的形式是尾部递归的吗,不管它是否可以优化?@jilen理论上我会说是的,因为从理论上讲,你不需要在堆栈调用中获取部分结果,实际上没有任何事情发生,如其他答案所示。
scala> import scala.annotation.tailrec
import scala.annotation.tailrec
scala> @tailrec
| def abc(a: Int): Int = a + abc(a+1)
<console>:10: error: could not optimize @tailrec annotated method abc: it contains a recursive call not in tail position
def abc(a: Int): Int = a + abc(a+1)
scala> @tailrec
| lazy val seq: Unit = {println("a"); seq}
seq: Unit = <lazy>
scala> seq
aa
a
...
scala> @tailrec
| def abc(a: Int): Int = abc(a+1)
abc: (a: Int)Int
scala> abc(0)
...