我已将方法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