Tema 1 Recursión

957
-1

Published on

Métodos recursivos e iterativos

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
957
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
21
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Tema 1 Recursión

  1. 1. Análisis y Diseño de SoftwareTema 1. RecursiónCarlos A. Iglesias <cif@gsi.dit.upm.es>Departamento de Ingeniería de Sistemas Telemáticos http://moodle.dit.upm.es
  2. 2. LegendaTeoríaEjercicio práctico en el ordenadorAmpliación de conocimientosLectura / Vídeo / PodcastPráctica libre / Experimentación Recursión 2
  3. 3. Bibliografía● Libros: – Data Structures & Algorithms in Java, Robert Lafore, 2nd Edition, SAMS, capítulo 6, recursión, 2002 Recursión 3
  4. 4. BiblografíaCracking the codinginterview: 150problems andsolutions, G.Laakmann, 5th edition,CareersCup, 2011. Recursión 4
  5. 5. Bibliografía● Gödel, Escher, Bach, Un eterno y grácil bucle, Douglas Hofstadter, Tusquets,1987. Recursión 5
  6. 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 Recursión 6
  7. 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 ) Recursión 7
  8. 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 Recursión 8
  9. 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 Recursión 9
  10. 10. Recursión @ Josh Sommers Recursión 10
  11. 11. Recursión Recursión @ Josh Sommers 11
  12. 12. Algoritmo“Conjunto ordenado y finito de operacionesque permite hallar la solución de unproblema.” (RAE ) Recursión 12
  13. 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) Recursión 13
  14. 14. Ejemplo - Fibonacci● Los conejos no crían hasta los 2 meses● Desde el mes 2, cada mes dan 1 cría Recursión 14
  15. 15. Sucesión de Fibonacci● 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …● Serie: – F(0) = 0 – F(1) = 1 – F(2) = F(1) + F(0) – F(3) = F(2) + F(1) – … – F(n) = F(n-1)+F(n-2)● Definición – F(n) = n, n < 2 – F(n) = F(n-1) + F(n-2), n >= 2 Leonardo de Pisa, Fibonacci Recursión 15
  16. 16. Resolución : Recursivo vs iterativoRecursivo: la Iterativa: usamos unfunción se llama a sí buclemisma Recursión 16
  17. 17. Cómo funciona la recursiónRepetimos el cálculo de forma muy ineficiente: 18 llamadas a F:1xF(5), 2xF(4), 3xF(3), 5xF(2), 3xF(1), calculando varias veces lomismo Recursión 17
  18. 18. Mejora algoritmo recursivo Recursión 18
  19. 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” Recursión 19
  20. 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é? Recursión 20
  21. 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 Recursión 21
  22. 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 Recursión 22
  23. 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 llamadasCaso base no recursivoRecursión Recursión 23
  24. 24. Ejercicio● Programar la función factorial, de forma iterativa y recursiva – factorial(0) = 1 – factorial(n) = n* factorial(n-1)● Ej. 5! = 5 * 4! = 5 * (4 * 3!) = 5 * (4 * (3 * 2!)) = 5 * (4 * (3 * (2 * 1!))) = 5 * (4 * (3 * (2 * (1 * 0!)))) = 5 * (4 * (3 * (2 * (1 * 1))))) =5*4*3*2*1 = 120 Recursión 24
  25. 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) Recursión 25
  26. 26. Pila de llamadas. factorialD(4) f(4) Variable local n f(4) = 4 * f(3) f(3) f(4) Variable local n f(3) = 3 * f(2) f(2) f(3) Variable local n f(2) = 2 * f(1) f(4) Recursión 26
  27. 27. Pila de llamadas (II) f(1) f(2) f(3) f(4) Variable local n f(1) = 1 f(2) f(3) f(4) Variable local n f(2) = 2 * 1 = 2 f(3) f(4) Variable local n f(3) = 3 * 2 = 6 Recursión 27
  28. 28. Pila de llamadas (III) f(4) Variable local n f(4) = 4 * 6 = 24 Recursión 28
  29. 29. Preguntas...● ¿Esla 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 Recursión 29
  30. 30. Recursión Recursión 30
  31. 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 Recursión 31
  32. 32. ¿Preguntas? Recursión 32

×