我已標記的方法sameLength檢查和優化尾遞歸。我覺得在同一長度方法中的最後一次操作是不一樣的。這是& &。該& &是其他子句。爲什麼編譯器不標記這個。由於編譯器沒有標記它,我假設它確實是尾遞歸的。有人可以爲我定義尾遞歸嗎?我腦海中有一個錯誤的定義。爲什麼Scala編譯器沒有標誌這似乎不是一個尾遞歸函數?
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)))
}
我不知道這是否是編譯器做什麼,但布爾表達式是由「短路」方法計算:如果ys.nonEmpty是假然後沒有必要計算sameLength。如果是真的,那麼它將返回sameLength的結果,使得它確實尾遞歸 – Eduardo