Saltar al contenido principal
03Funciones

Recursividad

Clase 5 de 74 min de lectura

¿Una función que se llama a sí misma? Suena a trabalenguas, pero es una técnica de programación con nombre propio: la recursividad.

Pero claro, si una función se llama a sí misma, ¿cuándo termina? ¿Cómo evitamos que se llame infinitamente? Con una condición base: un caso en el que la función deja de llamarse y sale.

Ejemplo de recursividad#

Vamos a crear una función que cuente desde un número hasta cero. Fíjate en dos cosas: el if del principio, que es la condición base, y la última línea, donde la función se llama a sí misma.

function cuentaAtras(numero) {  // Condición base: Si el número que recibe es  // menor de 0 entonces salimos de la función  if (numero < 0) {    return  }  // Si el número era mayor o igual a 0, lo mostramos  console.log(numero)  // Y llamamos a la función con el número anterior  cuentaAtras(numero - 1)}

Si llamamos a la función con el número 3, el resultado será:

cuentaAtras(3)// -> 3// -> 2// -> 1// -> 0

La ejecución la veríamos así:

cuentaAtras(3)
muestra 3
cuentaAtras(2)
muestra 2
cuentaAtras(1)
muestra 1
cuentaAtras(0)
muestra 0
cuentaAtras(-1) → cumple la condición base y sale
Cada llamada se llama a sí misma con un número menor hasta llegar a la condición base.

Usando recursividad y devolviendo un valor#

Una función recursiva también puede devolver un valor, y por eso la recursividad se usa muchas veces para resolver algoritmos. Por ejemplo, vamos a calcular el factorial de un número.

Dicho de otra manera: el factorial de 5 es 5 multiplicado por el factorial de 4. Y esa definición, que se apoya en sí misma, es justo lo que hace el return del else:

function factorial(n) {  // Condición base: Si el número es 0 o 1, devolvemos 1  // y no llamamos a la función de nuevo  if (n === 0 || n === 1) {    return 1  } else {    // Si el número es mayor que 1, llamamos a la función    return n * factorial(n - 1)  }}console.log(factorial(5)) // -> 120console.log(factorial(3)) // -> 6

Cada llamada se queda esperando el resultado de la siguiente, hasta que la condición base devuelve el primer valor.

Infografía
La pila de llamadas de factorial(3)
6.La pila queda vacía y console.log muestra 6. La última llamada en entrar fue la primera en resolverse.
Paso 6 de 6

La recursividad cuesta entenderla al principio. A mucha gente le vuela la cabeza.

¿Qué te recomiendo para aprenderlo? Primero, entiende los ejemplos que hemos hecho y dibuja en un papel cómo se ejecutan las funciones.

Después, haz estos ejercicios de recursividad:

  • La suma de los primeros n números. Escribe una función que calcule la suma de los primeros n números enteros de forma recursiva. Por ejemplo: suma(3) -> 1 + 2 + 3 = 6

  • La sucesión de Fibonacci. Escribe una función que la calcule de forma recursiva. La sucesión de Fibonacci es una serie de números que empieza por 0 y 1 y en la que cada número es la suma de los dos anteriores. Por ejemplo: fibonacci(6) -> 8 (0, 1, 1, 2, 3, 5, 8)

En resumen

  • La recursividad consiste en que una función se llame a sí misma.
  • Toda función recursiva necesita una condición base que detenga las llamadas; sin ella, se llamaría infinitamente.
  • Una función recursiva también puede devolver un valor construido con el resultado de sus propias llamadas, como n * factorial(n - 1).