我已将方法sameLength标记为要检查和优化尾递归。我觉得sameLength方法中的最后一个操作不是sameLength。它是 &&。 &&位于else子句中。为什么编译器不标记此。由于编译器未标记它,因此我认为它确实是尾递归的。有人可以为我定义尾递归吗?我心中的定义有误。

  import scala.annotation.tailrec


  object TestTailRec extends App{

    @tailrec
    def sameLength[T](xs: List[T], ys: List[T]) : Boolean = {
      if(xs.isEmpty) ys.isEmpty
      else ys.nonEmpty && sameLength(xs.tail, ys.tail)
    }

    println(sameLength(List(1,2,3), List(1,2,3)))

  }

最佳答案

The spec&&定义Boolean方法。

由于Boolean是值类,因此将内联if/else表达式。

由于p参数是按名称命名的,因此不会首先对其进行评估。

您的直觉得到了严格版本的确认:

scala> @tailrec def f(i: Int): Boolean = false & f(i)
<console>:16: error: could not optimize @tailrec annotated method f: it contains a recursive call not in tail position

07-24 14:28