Recursión de cola de JavaScript

Waqar Aslam 12 octubre 2023
  1. Uso de recursividad de cola
  2. Cómo implementar la recursión de cola en JavaScript
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:

  1. 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.

  2. 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.

  3. 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.

Waqar Aslam avatar Waqar Aslam avatar

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