¿Qué es la recursividad en Java?: una función que se llama a sí misma

| Última modificación: 15 de octubre de 2024 | Tiempo de Lectura: 4 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Siendo Java uno de los lenguajes de programación más importantes en la actualidad, la recursividad es una de sus características más importantes. Esta es una técnica que hace posible que una función se llame a sí misma, una tarea que puede simplificarnos muchísimo la vida.

Por eso, en el día de hoy te vamos a explicar cómo hacer que una función se llame a sí misma por medio de la recursividad en Java.

¿Qué es la recursividad en Java?

En Java no es común ver que una función se llame a sí misma para resolver algún problema. No obstante, la recursividad en Java hace que esto sea posible. ¿Y cómo? Pues bien, este enfoque brinda la posibilidad de dividir un problema complejo en subproblemas pequeños y manejables. Divide y vencerás, ¿verdad?

Conceptos básicos de recursividad en Java

Para entender la recursividad en Java debemos tener presentes algunos conceptos básicos:

  1. Caso base: Es la condición que termina la recursión. Sin un caso base, la función se llamaría a sí misma indefinidamente, causando un desbordamiento de pila.
  2. Caso recursivo: Es la parte de la función que divide el problema en subproblemas más pequeños y se llama a sí misma para resolverlos.

Ahora veamos un ejemplo sobre el factorial de un número para entender mejor qué es la recursividad en Java:

Ejemplo: Factorial de un número

El cálculo del factorial de un número es un ejemplo clásico de recursividad. El factorial de un número n (denotado como n!) se define como el producto de todos los enteros positivos menores o iguales a n. Por ejemplo, 5! = 5 * 4 * 3 * 2 * 1 = 120.

//Recursividad en Java
public class RecursividadJava {
public static void main(String[] args) {
int numero = 5;
System.out.println("El factorial de " + numero + " es: " + factorial(numero));
}

public static int factorial(int n) {
// Caso base
if (n == 0) {
return 1;
}
// Caso recursivo
else {
return n * factorial(n - 1);
}
}
}

🔴 ¿Quieres Aprender a Programar con Python? 🔴

Descubre el Full Stack Jr. Bootcamp - Aprende a Programar desde Cero de KeepCoding. La formación más completa del mercado y con empleabilidad garantizada

👉 Prueba gratis el Bootcamp Aprende a Programar desde Cero por una semana

Desglosemos para entender mejor, como siempre:

  1. Caso base: Si n es 0, la función retorna 1, ya que el factorial de 0 es 1.
  2. Caso recursivo: Si n no es 0, la función retorna n multiplicado por el factorial de n-1.

La función continúa llamándose a sí misma hasta que se alcanza el caso base, momento en el cual se detiene la recursión y se retorna el resultado.

Otros ejemplos de recursividad en Java

Además del caso del factorial, podemos ver muchos ejemplos del uso de la recursividad en Java:

Suma de los primeros n números naturales

//Recursividad en Java
public class RecursividadDirecta {
public static void main(String[] args) {
int n = 5;
System.out.println("La suma de los primeros " + n + " números naturales es: " + suma(n));
}

public static int suma(int n) {
// Caso base
if (n == 0) {
return 0;
}
// Caso recursivo
else {
return n + suma(n - 1);
}
}
}

En este caso tenemos un método recursivo suma que calcula la suma de los primeros n números naturales.

  • Caso base: La condición if (n==0) detiene la recursión devolviendo 0, lo que evita un bucle infinito.
  • Caso recursivo: La función se llama a sí misma con n-1 hasta alcanzar el caso base. En cada llamada, suma el valor actual de n al resultado de la llamada recursiva.

Para n=5, la función se ejecuta de la siguiente manera:

  • suma(5) retorna 5 + suma(4)
  • suma(4) retorna 4 + suma(3)
  • suma(3) retorna 3 + suma(2)
  • suma(2) retorna 2 + suma(1)
  • suma(1) retorna 1 + suma(0)
  • suma(0) retorna 0 (caso base)

Estas llamadas se resuelven sumando los valores hasta obtener el resultado final.

La salida del programa sería:

La suma de los primeros 5 números naturales es: 15

Condición de parada en recursividad

La condición de parada es crucial para evitar la recursividad infinita, que puede causar un desbordamiento de pila y otros errores. Esta condición define cuándo la función debe dejar de llamarse a sí misma y retornar un resultado. Sin una condición de parada adecuada, la recursividad puede llegar a causar problemas en la ejecución del programa.

Veamos un ejemplo de factorial con condición de parada, muy similar al primero pero explicado de una manera distinta:

public class FactorialCondicionParada {
public static void main(String[] args) {
int numero = 5;
System.out.println("El factorial de " + numero + " es: " + factorial(numero));
}
public static int factorial(int n) {
// Caso base: si n es 0, retorna 1
if (n == 0) {
return 1;
}
// Caso recursivo: llama a la función con n-1
else {
return n * factorial(n - 1);
}
}
}

En este caso se tiene un método recursivo factorial que calcula el factorial de un número n.

  • El caso base: La condición if (n==0) detiene la recursión devolviendo 1. Esto se debe a que el factorial de 0 (0!) es 1, y esta condición evita un bucle infinito.
  • El caso recursivo: La función se llama a sí misma con n-1 hasta alcanzar el caso base. En cada llamada, multiplica el valor actual de n por el resultado de la llamada recursiva factorial(n-1).

Para n=5, la función se ejecuta de la siguiente manera:

  • factorial(5) retorna 5 * factorial(4)
  • factorial(4) retorna 4 * factorial(3)
  • factorial(3) retorna 3 * factorial(2)
  • factorial(2) retorna 2 * factorial(1)
  • factorial(1) retorna 1 * factorial(0)
  • factorial(0) retorna 1 (caso base)

Al igual que en el caso anterior, las llamadas se resuelven multiplicando (en vez de sumando) los valores hasta obtener el resultado final.

La salida del programa es:

El factorial de 5 es: 120

¿Quieres ser un experto en Java y su interesante universo? En Keepcoding tenemos el mejor bootcamp java para ti, en donde aprenderás no solo todos los fundamentos sobre Java, sino que te prepararemos con los mejores profesionales para que aprendas cómo conseguir tu primer empleo en programación.

¡No dudes más e inscríbete a los cursos más completos en el sector tech!

Ramón Maldonado

Full Stack Developer y Responsable de Formación base en KeepCoding.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Java y Spring Boot

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado

¡CONVOCATORIA ABIERTA!

Aprende a Programar desde Cero

Full Stack Jr. Bootcamp

Apúntate y consigue uno de los perfiles más demandados con Python en solo 4 meses.