Ich habe versucht, Tail call optimization
Im Kontext von JavaScript zu verstehen, und habe die folgenden rekursiven und Schwanz-rekursiven Methoden für factorial()
geschrieben.
rekursiv:
function factorial (n) {
if (n < 2) {
return 1;
} else {
return n * factorial(n-1);
}
}
Schwanz-rekursiv:
function factorial (n) {
function fact(n, acc) {
if (n < 2) {
return acc;
} else {
return fact(n-1, n * acc);
}
}
return fact(n, 1)
}
Ich bin mir aber nicht sicher, ob die tail-recursive
- Version der Funktion durch den JavaScript-Compiler optimiert wird, wie es in anderen Sprachen wie Scala usw. geschieht. Kann mir jemand dabei helfen? eins?
Update: Ab dem 13. März 2018 unterstützt Safari als einziger Browser die Tail-Call-Optimierung.
Das Chromium-Team gibt ausdrücklich an, dass die Schwanzrufoptimierung nicht in der aktiven Entwicklung ist und nachverfolgt werden kann hier .
Die Implementierung für Firefox kann verfolgt werden hier
Originalbeitrag
Ja, ES2015 bietet eine Tail-Call-Optimierung im Strict-Modus. Dr. Axel Rauschmayer legt es unter dem folgenden Link schön aus, damit ich seine Worte hier nicht wiederhole.
Hinweis: ES 5 optimiert keine Tail Calls.
Theoretisch ja. Wie die andere Antwort sagt.
In der Praxis wird dies jedoch ab Juli 2017 nur von Safari unterstützt.
Kompatibilität mit Javascript ES6 (ES2015): https://kangax.github.io/compat-table/es6/