gpt4 book ai didi

scala - 为什么 Scala 编译器没有标记看起来不是尾递归函数的东西?

转载 作者:行者123 更新时间:2023-12-01 03:35:18 25 4
gpt4 key购买 nike

我已经标记了方法 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

关于scala - 为什么 Scala 编译器没有标记看起来不是尾递归函数的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35416389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com