Scala 一个懒惰的val可以是递归的吗?

Scala 一个懒惰的val可以是递归的吗?,scala,tail-recursion,Scala,Tail Recursion,我们可以递归地调用tail上面的表达式吗 你可以问回复人: lazy val seq: Unit = { println("a") seq } 您的val定义不需要在堆栈上,因为没有任何操作需要与堆栈过程中累积的部分结果相结合。我想您可以从这个意义上说,是的-在计算时,seq将递归地计算自身,其评估是执行的最后一个操作 不过,不管这是否可以称为尾部递归,这似乎没有什么意义。没有退出条件,如果您试图保持代码完全正常运行,也不会有退出条件:没有参数,这意味着没有“状态”可以传递给更深入的求

我们可以递归地调用tail上面的表达式吗

你可以问回复人:

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)
  ...