Recursividad en Java
Nivel 4 · 40 min · 3 preguntas

Recursion sobre estructuras

Aqui es donde entiendes para que existe la recursion.

La idea en una frase

Cuando la estructura de datos ya es recursiva, el algoritmo recursivo no es elegancia: es la traduccion literal.

Antes de ver codigo

Una carpeta contiene carpetas, que contienen carpetas. Cuando te piden contar cuantos archivos hay dentro, nadie hace una lista plana: abres cada subcarpeta y repites el mismo procedimiento. Ya estabas pensando de forma recursiva sin llamarlo asi.

Estructuras que se contienen a si mismas

Un arbol binario es un nodo con dos arboles binarios adentro. Una carpeta es un nombre con carpetas adentro. Una lista enlazada es un nodo seguido de una lista enlazada.

Cuando la estructura es recursiva, el algoritmo recursivo no es una opcion elegante: es la traduccion directa de la definicion. Escribirlo con bucles es traducirlo mal.

Los tres recorridos de un arbol

Y aqui vuelve el nivel 2. La unica diferencia entre los tres recorridos es donde pones la visita respecto a las dos llamadas recursivas.

static void inorden(Nodo n) {
    if (n == null) return;
    inorden(n.izq);
    visitar(n);        // en el medio
    inorden(n.der);
}

// preorden : visitar ANTES de las dos llamadas
// postorden: visitar DESPUES de las dos llamadas

En un arbol binario de busqueda, el recorrido inorden devuelve los valores ordenados de menor a mayor. Salio gratis.

El caso base es null

En estructuras el caso base casi nunca es un numero. Es "ya no hay nada": null, lista vacia, indice fuera del arreglo. Ponerlo de primero y devolver de inmediato evita la mitad de los NullPointerException.

Ejecuta y observa

Aqui es donde la teoria de arriba se vuelve concreta. Cambia los parametros, dale a Reproducir, y sobre todo usa las flechas para ir paso a paso: la velocidad automatica sirve para ver la forma general, pero lo que de verdad ensena es detenerse en un retorno y entender por que vuelve ahi y no a otro lado.

Errores que vas a cometer

No son ejemplos inventados: son los que aparecen una y otra vez en los parciales. Lee el codigo, decide tu mismo que esta mal, y solo despues abre la correccion. Si la abres de una, no aprendes nada.

Comprobar el hijo en vez del nodo actual

static void recorrer(Nodo n) {
    visitar(n);
    if (n.izq != null) recorrer(n.izq);
    if (n.der != null) recorrer(n.der);
}

Comprueba lo que entendiste

Responde sin devolverte a leer. Si fallas no pasa nada: la explicacion te dice exactamente donde estaba el hueco, y ese es el momento en que de verdad se aprende. Con el 70% el nivel queda aprobado.