¿Están optimizadas las funciones en JavaScript tail-call?
recursion tail-recursion (2)
He intentado comprender la Tail call optimization
en el contexto de JavaScript y he escrito los métodos recursivos y recursivos de cola siguientes para factorial()
.
Recursivo:
function factorial (n) {
if (n < 2) {
return 1;
} else {
return n * factorial(n-1);
}
}
Cola recursiva:
function factorial (n) {
function fact(n, acc) {
if (n < 2) {
return acc;
} else {
return fact(n-1, n * acc);
}
}
return fact(n, 1)
}
Pero no estoy seguro de si la versión tail-recursive
de la función se optimizará con el compilador de JavaScript, ya que se hace en otros idiomas como Scala, etc. ¿Alguien puede ayudarme con este?
En teoría, sí. Como dice la otra respuesta.
En la práctica, sin embargo, a partir de julio de 2017, No. Only Safari lo admite.
Compatibilidad Javascript ES6 (ES2015): https://kangax.github.io/compat-table/es6/
Actualización: a partir del 13 de marzo de 2018 Safari es el único navegador que admite la optimización de llamadas de cola.
El equipo de cromo afirma explícitamente que Tail Call Optimization no está en desarrollo activo y puede rastrearse here .
La implementación de Firefox se puede rastrear here
Publicación original
Sí, ES2015 ofrece optimización de llamadas de cola en modo estricto. El Dr. Axel Rauschmayer lo explica muy bien en el siguiente enlace, así que no voy a repetir sus palabras aquí.
Nota: ES 5 no optimiza las llamadas finales.