• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
 

Tema 1 Recursión

on

  • 1,186 views

Métodos recursivos e iterativos

Métodos recursivos e iterativos

Statistics

Views

Total Views
1,186
Views on SlideShare
966
Embed Views
220

Actions

Likes
0
Downloads
14
Comments
0

1 Embed 220

https://moodle.lab.dit.upm.es 220

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Tema 1 Recursión Tema 1 Recursión Presentation Transcript

    • 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
    • LegendaTeoríaEjercicio práctico en el ordenadorAmpliación de conocimientosLectura / Vídeo / PodcastPráctica libre / Experimentación Recursión 2
    • Bibliografía● Libros: – Data Structures & Algorithms in Java, Robert Lafore, 2nd Edition, SAMS, capítulo 6, recursión, 2002 Recursión 3
    • BiblografíaCracking the codinginterview: 150problems andsolutions, G.Laakmann, 5th edition,CareersCup, 2011. Recursión 4
    • Bibliografía● Gödel, Escher, Bach, Un eterno y grácil bucle, Douglas Hofstadter, Tusquets,1987. Recursión 5
    • 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
    • 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
    • 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
    • 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
    • Recursión @ Josh Sommers Recursión 10
    • Recursión Recursión @ Josh Sommers 11
    • Algoritmo“Conjunto ordenado y finito de operacionesque permite hallar la solución de unproblema.” (RAE ) Recursión 12
    • ¿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
    • Ejemplo - Fibonacci● Los conejos no crían hasta los 2 meses● Desde el mes 2, cada mes dan 1 cría Recursión 14
    • 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
    • Resolución : Recursivo vs iterativoRecursivo: la Iterativa: usamos unfunción se llama a sí buclemisma Recursión 16
    • 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
    • Mejora algoritmo recursivo Recursión 18
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • Pila de llamadas (III) f(4) Variable local n f(4) = 4 * 6 = 24 Recursión 28
    • 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
    • Recursión Recursión 30
    • 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
    • ¿Preguntas? Recursión 32