1. Análisis y Diseño
de Software
Departamento de Ingeniería de Sistemas Telemáticos
http://moodle.dit.upm.es
Tema 1. Recursión
Carlos A. Iglesias <cif@gsi.dit.upm.es>
6. Recursión 6
Vídeo recursión
● Vídeo depuración con eclipse y recursión
http://comscigate.com/environ/Eclipse/tut/debugger/debugger-lesson07/lesson07.html
7. Recursión 7
Enlaces
● Sucesión de Fibonacci
– http://es.wikipedia.org/wiki/Sucesi%C3%B3n_de_Fibonacci
● Recursión
– http://es.wikipedia.org/wiki/Recursi%C3%B3n_(ciencias_de_computaci%C3
%B3n
)
8. Recursión 8
Temario
● Qué es un algoritmo recursivo
● Recursión e iteración
● Fibonacci. Versión recursiva e iterativa
● Cómo programar un algoritmo recursivo
● Depurar métodos recursivos con Eclipse
9. Recursión 9
Objetivos
● Entender qué es un algoritmo recursivo
● Entender la diferencia entre recursión e
iteración
● Entender el código de un método recursivo
● Aprender a programar un método recursivo
● Aprender a depurar un método recursivo
13. Recursión 13
¿Qué es un método
recursivo?
● Un método que se llama a sí mismo
● Para que no entre en bucle infinito, tiene
que tener una condición de parada (de la
recursividad)
14. Recursión 14
Ejemplo - Fibonacci
● Los conejos no crían hasta los 2 meses
● Desde el mes 2, cada mes dan 1 cría
16. Recursión 16
Resolución : Recursivo vs
iterativo
Recursivo: la
función se llama a sí
misma
Iterativa: usamos un
bucle
17. Recursión 17
Cómo funciona la recursión
Repetimos el cálculo de forma muy ineficiente: 18 llamadas a F:
1xF(5), 2xF(4), 3xF(3), 5xF(2), 3xF(1), calculando varias veces lo
mismo
19. Recursión 19
Eficiencia...
● El ejemplo de Fibonacci es un ejemplo de
'mal uso de la recursión'
– Calculando sucesión hasta 50:
• Iterativo / Recursivo con memoria: 3seg por número
• Recursivo “puro”
20. Recursión 20
Prueba...
● Prueba a cambiar
long en la
implementación
iterativa por int (p.ej.
f1 y f2) y prueba
para un valor alto
(47, …) ¿qué
sucede, por qué?
21. Recursión 21
Cómo reconocer una función
recursiva
● Un problema que está compuesto de
subproblemas
● El problema se puede definir como un
término n que se calcula en función del
término n - 1
22. Recursión 22
Cómo implementar un método
recursivo
● Piensa cuál es el subproblema
● Resuelve el “caso base”, normalmente
será un valor 'constante', p.ej. f(0)
● Intenta entender cómo calcular f(1)
● Calcula f(2) en función de f(1)
● Generaliza para el caso n
23. Recursión 23
Cómo programar una función
recursiva
● Caso base no recursivo (condición de
parada de la recursión)
● Recursión pasando un valor diferente
● Precaución:
– No entrar en bucle infinito
– Tener suficiente memoria para la pila de
llamadas
Caso base no recursivo
Recursión
25. Recursión 25
La pila de llamadas
● Vamos a ver cómo depurar (ver vídeo de
bibliografía)
● Pasos
– Ponemos un punto de parada (breakpoint)
• P ej. en la declaración del método
– Ejecutamos “Debug As”
• JUnitTest (si lo lanzamos con Junit)
• Java application (si lo lanzamos desde el main)
26. Recursión 26
Pila de llamadas.
factorialD(4)
Variable local n f(4) = 4 * f(3)
Variable local n f(3) = 3 * f(2)
Variable local n f(2) = 2 * f(1)
f(2)
f(3)
f(4)
f(3)
f(4)
f(4)
27. Recursión 27
Pila de llamadas (II)
Variable local n f(1) = 1
Variable local n f(2) = 2 * 1 = 2
Variable local n f(3) = 3 * 2 = 6
f(1)
f(2)
f(3)
f(4)
f(2)
f(3)
f(4)
f(3)
f(4)
29. Recursión 29
Preguntas...
●¿Es la versión recursiva
normalmente más rápida?
– NO
●¿Ocupa menos memoria la
versión recursiva?
– NO
●¿Entonces por qué usamos
recursión?
– A veces es mucho más simple
programar la versión recursiva
31. Recursión 31
Resumen
● Usa recursión para tener código más claro que
facilite su programación y mantenimiento
● Recuerda que un método recursivo
– Tiene que tener un caso base
– La recursión debe hacer que avance hacia el caso base
● La recursión puede ser elegante y a menudo está
infrautilizada, mira si es una buena solución cuando
tiene un problema
● Ten en cuenta los recursos y si necesitas optimizar
la solución o es mejor la opción iterativa