Ich bin durch folgenden Code verwirrt: Der Code ist künstlich, aber ich denke immer noch, es ist Schwanz rekursiv. Der Compiler stimmt nicht zu und erzeugt eine Fehlermeldung:Warum Rückkehr in getOrElse Tail-Rekursion nicht möglich?
Wie ist der oben genannte Code, der die Tail Recusion nicht möglich macht? Warum sagt der Compiler mir:
could not optimize @tailrec annotated method listSize: it contains a recursive call not in tail position
Einen ähnlichen Code (mit return
innerhalb von map
) fein kompiliert:
@annotation.tailrec
def listSize(l : Seq[Any], s: Int = 0): Int = {
if (l.isEmpty) {
Some(()).map(return s)
}
listSize(l.tail, s + 1)
}
Auch der Code, der durch None.isEmpty
inlining kompiliert fein:
@annotation.tailrec
def listSize(l : Seq[Any], s: Int = 0): Int = {
if (l.isEmpty) {
if (None.isEmpty) {
return s
} else None.get
}
listSize(l.tail, s + 1)
}
Auf der anderen Seite ist Code mit leicht modifizierten Karte von der Compil abgelehnt er und erzeugt den Fehler:
@annotation.tailrec
def listSize(l : Seq[Any], s: Int = 0): Int = {
if (l.isEmpty) {
Some(()).map(x => return s)
}
listSize(l.tail, s + 1)
}
Ich habe das Gefühl der Compiler kann nicht entscheiden, ob Ihre Methode tail rekursiv ist wegen der Return-Anweisung, wahrscheinlich ist er defensiv und sagt Ihnen, dass die Rekursion nicht garantiert ist. –