Estructuras de datos · Sección 2

Recursividad y pila de llamadas

Caso base, reducción del problema, registros de activación y diseño de soluciones recursivas correctas antes de escribir código.

3
lecciones
3
ejercicios resueltos
CONTENIDO ORIGINAL

Avanza en orden. Cada lección está redactada para Palta es Cool, utiliza ejemplos propios y termina con una actividad cuya respuesta puedes desplegar.

ANTES DE EMPEZAR

Ubícate antes de avanzar

01 / PUNTO DE PARTIDA

Necesitas distinguir una llamada de método, un parámetro y una referencia null; la sección anterior presenta ese modelo.

02 / META OBSERVABLE

Al terminar deberías poder relacionar Caso base y progreso con Pila de llamadas y resolver un caso nuevo.

03 / TIEMPO SUGERIDO

Reserva entre 35 y 55 minutos para lectura, ejemplos, tres comprobaciones y cierre.

04 / PREPARA EL LABORATORIO

Instala un JDK actual y utiliza un editor o IDE con soporte para Java. Trabaja en un proyecto de laboratorio separado.

Abrir la guía de herramientas →
Diagnóstico rápido: ¿cómo se relacionan Caso base y progreso y Pila de llamadas? +

No necesitas acertar todavía. Escribe una hipótesis de dos líneas y compárala con tu respuesta al finalizar; si puedes corregirla y justificar el cambio, hubo aprendizaje.

Ruta guiada · 3 lecciones

Aprende el tema paso a paso

Aprenderás a diseñar recursión demostrando primero que termina y después siguiendo cada llamada en la pila.

Al terminar podrás
  • Toda recursión necesita un caso base y progreso
  • La pila conserva el trabajo pendiente de cada llamada
  • Arreglos y nodos requieren un estado explícito
01
Estructura mínima

Toda recursión necesita un caso base y progreso

Una función recursiva resuelve una instancia usando una más pequeña del mismo problema. El caso base responde directamente y cada llamada debe acercarse a él. El contrato también debe excluir o manejar entradas que no alcanzan ese caso; sin una medida que disminuya, la función puede no terminar.

01

Define qué significa el parámetro.

02

Escribe primero el caso más pequeño.

03

Demuestra que cada llamada reduce la medida.

Comprueba lo aprendido · 01

¿Qué ocurriría si la llamada usara suma(n + 1)?

Mostrar respuesta +

Para una entrada positiva se alejaría del caso base y terminaría agotando la pila de llamadas.

02
Ejecución

La pila conserva el trabajo pendiente de cada llamada

Cada invocación crea un registro con parámetros, variables locales y punto de retorno. El trabajo anterior a la llamada ocurre al avanzar; el posterior ocurre cuando las llamadas retornan en orden inverso. Dibujar estos registros evita razonar por intuición.

01

Las llamadas se apilan.

02

El caso base inicia los retornos.

03

La última llamada pendiente termina primero.

Comprueba lo aprendido · 02

¿Por qué la segunda impresión aparece en orden ascendente?

Mostrar respuesta +

Porque queda pendiente en cada registro y se ejecuta al desapilar las llamadas, desde la instancia más pequeña hacia la primera.

03
Datos recursivos

Arreglos y nodos requieren un estado explícito

En un arreglo suele pasarse un índice; en una lista enlazada, la referencia al nodo actual. Un método público valida la entrada y prepara ese estado, mientras un método privado realiza la recursión. Conviene preferir un ciclo cuando la profundidad puede crecer mucho sin aportar claridad.

01

El índice o nodo identifica el subproblema.

02

El método envolvente protege el contrato público.

03

La profundidad n consume O(n) memoria de pila.

Comprueba lo aprendido · 03

¿Cuándo sería preferible un ciclo para recorrer la lista?

Mostrar respuesta +

Cuando la lista puede ser muy larga y la recursión no simplifica el razonamiento, porque el ciclo usa memoria auxiliar constante y evita desbordar la pila.

Resumen de la sección

Tu recorrido en tres ideas

  1. Toda recursión necesita un caso base y progreso
  2. La pila conserva el trabajo pendiente de cada llamada
  3. Arreglos y nodos requieren un estado explícito
CIERRE DE LA SECCIÓN

Comprueba que puedes usarlo

Antes de continuar, revisa estos tropiezos frecuentes y resuelve un caso sin copiar los ejemplos.

ERROR 01

Escribir la llamada recursiva sin demostrar que se acerca al caso base.

ERROR 02

Ignorar el consumo de pila para entradas largas.

DESAFÍO INTEGRADOR

Ahora hazlo sin guía

Implementa de forma recursiva el tamaño y la suma de una lista enlazada, y dibuja las llamadas para tres nodos.

Mostrar pauta de corrección +
Una respuesta sólida:
  • El caso null tiene resultado correcto.
  • Cada llamada avanza al siguiente nodo.
  • Compara tiempo y memoria con una versión iterativa.