Herramientas para desarrolladores : Cursos, manuales y guías de referencia : Cursos : JavaScript avanzado :

Funciones recursivas

  1. Introducción
  2. Ejemplo de función recursiva
  3. Explicación del ejemplo
  4. Ventajas e inconvenientes

1. Introducción

La recursividad es una técnica de programación potente pero peligrosa. Para entender mejor en qué consiste, vamos a ver un ejemplo típico: el cálculo del factorial de un número.

2. Ejemplo de función recursiva

Repasando las matemáticas (estas cosas se olvidan fácilmente) vemos que para calcular el factorial de un número n utilizamos la siguiente fórmula:

n! = n * (n-1) * (n-2) * ... * (1)

El siguiente script implementa este algoritmo haciendo uso de la recursividad:

<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
function factorial(numero) {
   if (numero > 0) {
     return numero * (factorial(numero - 1))
   } else {
      return 1
   }
}
</SCRIPT>

3. Explicación del ejemplo

Vamos a intentar comprender cómo funciona el script anterior. La función factorial() utiliza una sentencia condicional if...then...else para determinar cuándo debe llamarse a sí misma. En cada ejecución, la función se llama a sí misma con un valor que es una unidad inferior al valor anterior. Así se implementa la recursividad del algoritmo.

El proceso se prolongaría hasta el infinito si no controláramos el parámetro de entrada de la función. Si el parámetro de entrada de la función es mayor o igual que 1, se llama a sí misma con ese valor menos uno. En la próxima multiplicación utiliza ese valor.

Si el parámetro de entrada de la función es menor que 1, devuelve 1 y se inicia el retorno (hay que observar que se retorna en cadena de todas las funciones factorial que hayan sido llamadas).

4. Ventajas e inconvenientes

La recursividad es confusa y, más aún, peligrosa. No es difícil que una programa recursivo deje sin memoria a la máquina sobre la que se está ejecutando, debido a un algoritmo mál codificado. Incluso cuando el programa es correcto, su ejecución con determinados parámetros de entrada puede requerir tantas llamadas recursivas que llegue a agotar los recursos del sistema (cada llamada implica el alamacenamiento de variables de estado y otros parámetros).

Otro inconvieniente está en la velocidad. Las sucesivas llamadas a sí misma que realiza la fución recursiva ralentizan la ejecución de todo el proceso.

La única gran ventaja de la recursividad está en la reducción, en algunos casos notable, del tamaño del código. Sin embargo, este aspecto nunca pesa más que la creación de un código seguro, rápido y estable.

 

Tutorial de JavaScript