Recursividad en Java
Nivel 1 · 30 min

Anatomia de un metodo recursivo

Caso base y caso recursivo: las dos unicas piezas.

Un metodo que se llama a si mismo

Un metodo recursivo resuelve un problema resolviendo una version mas pequena del mismo problema. Nada mas. Y para no caer al vacio necesita saber cuando parar.

public static int factorial(int n) {
    if (n <= 1) {          // caso base
        return 1;
    }
    return n * factorial(n - 1);   // caso recursivo
}

Dos lineas conceptuales: donde paro, y como me acerco a ese punto.

Las tres reglas

1. Debe existir un caso base. Al menos una entrada para la cual el metodo responde sin volver a llamarse.

2. El caso recursivo debe acercarse al caso base. Si llamas factorial(n) desde factorial(n), el problema nunca encoge.

3. Confia en la llamada recursiva. Esto se llama el salto de fe: al escribir factorial(n-1) asume que ya devuelve el factorial correcto de n-1. No intentes seguir mentalmente todos los niveles, te vas a perder.

El salto de fe, en concreto

Para escribir sumaHasta(n) que suma 1+2+...+n, no pienses en la cadena completa. Piensa solo esto: "si alguien ya me diera la suma hasta n-1, que le hago?". Le sumas n. Y ya esta. Esa frase es literalmente el codigo.

public static int sumaHasta(int n) {
    if (n == 0) return 0;
    return n + sumaHasta(n - 1);
}

Ejecuta y observa

Cambia los parametros, dale a Reproducir, y usa las flechas para avanzar paso a paso. La pila crece hacia arriba: el marco de arriba es el que se esta ejecutando ahora mismo.

Errores que vas a cometer

Lee el codigo, decide que esta mal, y despues abre la correccion.

Falta el caso base

public static int factorial(int n) {
    return n * factorial(n - 1);
}

El problema no encoge

public static int sumaHasta(int n) {
    if (n == 0) return 0;
    return n + sumaHasta(n);
}

Comprueba lo que entendiste

Necesitas el 70% para dar el nivel por visto. Responde sin devolverte a la teoria: si fallas, la explicacion te dice exactamente donde estaba el hueco.