Recursión de cola de JavaScript
La recursión de cola es un concepto de programación que involucra una función que se llama a sí misma la última acción que realiza. Esta puede ser una técnica útil para optimizar ciertos algoritmos, ya que permite que la función reutilice su marco de pila en lugar de crear uno nuevo cada vez que se llama.
Esto puede ayudar a reducir la cantidad de memoria que utiliza el programa y mejorar su rendimiento.
En JavaScript, la recursión de cola no se admite de forma nativa, pero hay algunas formas de lograrlo utilizando varias técnicas. Echemos un vistazo más de cerca a qué es la recursión de cola, cómo funciona y cómo implementarla en JavaScript.
Uso de recursividad de cola
Hay algunas razones por las que la recursión de cola puede ser útil en ciertas situaciones:
-
Eficiencia de la memoria: cuando una función se llama a sí misma recursivamente, crea un nuevo marco de pila para cada llamada. Esto puede usar mucha memoria, especialmente para llamadas recursivas profundamente anidadas.
La recursión de cola permite que la función reutilice su marco de pila, lo que reduce la cantidad de memoria utilizada por el programa.
-
Rendimiento: la recursión de cola también puede ser más eficiente en términos de rendimiento, ya que permite que la función evite la sobrecarga de crear y destruir varios marcos de pila. Esto puede hacer que la función se ejecute más rápido, especialmente para valores de entrada grandes.
-
Simplicidad del código: la recursión de cola también puede hacer que el código sea más fácil de entender, ya que elimina la necesidad de un bucle explícito o una estructura iterativa. Esto puede hacer que el código sea más conciso y fácil de leer.
Cómo implementar la recursión de cola en JavaScript
Como se mencionó anteriormente, JavaScript no admite de forma nativa la recursión de cola. Sin embargo, hay algunas maneras de lograrlo usando varias técnicas.
Ejemplo 1
Un enfoque es utilizar la sintaxis de ES6 para los argumentos de función, lo que le permite especificar valores predeterminados para los parámetros de función. Esto se puede usar para implementar una función contenedora simple que maneja la recursividad de la cola por usted.
function factorial(n, result = 1) {
if (n === 1) {
return result;
} else {
return factorial(n - 1, n * result);
}
}
console.log('Factorial of 5 is ' + factorial(5));
Producción :
Factorial of 5 is 120
En este ejemplo, al parámetro resultado
se le da un valor predeterminado de 1
, por lo que si no se especifica cuando se llama a la función, por defecto será 1
. Esto nos permite crear una función contenedora simple que llama a factorial
con el parámetro resultado
establecido en 1
, que maneja la recursividad de la cola por nosotros.
Ejemplo 2
Otro enfoque es usar la propiedad arguments.callee
, que se refiere a la función que se está ejecutando actualmente. Esto se puede usar para implementar una función recursiva que se llama a sí misma como la última acción que realiza, como se muestra a continuación.
function factorial(n) {
if (n === 1) {
return 1;
} else {
return n * arguments.callee(n - 1);
}
}
console.log('Factorial of 5 is ' + factorial(5));
Producción :
Factorial of 5 is 120
Este enfoque funciona, pero tiene algunos inconvenientes. Primero, la propiedad arguments.callee
está obsoleta en modo estricto, por lo que su uso puede causar problemas si usa el modo estricto en su código.
En segundo lugar, la propiedad arguments.callee
puede sobrescribirse con otro código, lo que puede causar un comportamiento inesperado.
Ejemplo 3
Un tercer enfoque es utilizar una función de trampolín
, una función de orden superior que envuelve una función recursiva y permite llamarla de forma recursiva en la cola. Para implementar una función de trampolín, puede usar el siguiente patrón:
function trampoline(f) {
while (f && f instanceof Function) {
f = f();
}
return f;
}
function factorial(n, result = 1) {
if (n === 1) {
return result;
} else {
return () => factorial(n - 1, n * result);
}
}
console.log('Factorial of 5 is ' + trampoline(factorial(5)));
Producción :
Factorial of 5 is 120
En este ejemplo, la función factorial
se escribe de forma recursiva en la cola, siendo la llamada recursiva la última acción realizada antes de que la función regrese. La función trampolín
luego envuelve la función factorial
y maneja las llamadas recursivas por nosotros, permitiéndonos llamar a factorial
de una manera recursiva de cola.
Usar una función de trampolín
puede ser un poco más complejo que los otros enfoques, pero tiene la ventaja de ser más eficiente y menos propenso a errores.
I am Waqar having 5+ years of software engineering experience. I have been in the industry as a javascript web and mobile developer for 3 years working with multiple frameworks such as nodejs, react js, react native, Ionic, and angular js. After which I Switched to flutter mobile development. I have 2 years of experience building android and ios apps with flutter. For the backend, I have experience with rest APIs, Aws, and firebase. I have also written articles related to problem-solving and best practices in C, C++, Javascript, C#, and power shell.
LinkedIn