Ich habe eine Funktion, in der die markierte Zeile eine Konjunktion mit einem rekursiven Aufruf ist. Als Konjunktionen funktionieren, wenn h1 <> h2
dann der rekursive Aufruf nicht gemacht wird. Aber wenn der Aufruf gemacht wird, wird der Compiler dann noch zurückverfolgen und eine ganze Reihe von Konjunktionen über true
Werte ausführen? Oder wird es diesen unnötigen Schritt verhindern?Ist die folgende Funktion tail rekursiv?
Mit anderen Worten, ist die folgende Funktion effektiv tail rekursiv?
let isExtensionOf<'A when 'A : equality> (lst1 : list<'A>) (lst2 : list<'A>) : bool =
let rec helper (currLst1 : list<'A>) (currLst2 : list<'A>) : bool =
match currLst1, currLst2 with
| h1 :: _, [] -> false
| [], _ -> true
| h1 :: t1, h2 :: t2 -> (h1 = h2) && (helper t1 t2) // *
helper lst1 lst2
Ja, ich weiß, dass die Lieblingslinie if h1 = h2 then helper t1 t2 else false
geschrieben werden soll. Aber ich bin nur neugierig.
Vielen Dank im Voraus.
Der einfachste Weg, diese Art von Fragen zu beantworten: feed in einer gigantischen Liste, die Sie denken, wird das pathologische Verhalten auslösen und sehen, was passiert. –
Ich würde es lieber kompilieren und dann den resultierenden Code mit ILSpy betrachten. Zuverlässiger. Beachten Sie auch, dass das Ergebnis davon abhängig sein kann, ob Optimierungen aktiviert sind. –
Nun, es hat Listen von Kardinalität '1,00,000,000' (einhundert Millionen) gehandhabt, ohne mit der Wimper zu zucken, also nehme ich einfach an, dass meine Frage bejahend beantwortet werden kann. – Shredderroy