SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
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>
Recursión 2
Teoría
Ejercicio práctico en el ordenador
Ampliación de conocimientos
Lectura / Vídeo / Podcast
Práctica libre / Experimentación
Legenda
Recursión 3
Bibliografía
● Libros:
– Data Structures &
Algorithms in Java,
Robert Lafore, 2nd
Edition, SAMS,
capítulo 6,
recursión, 2002
Recursión 4
Biblografía
Cracking the coding
interview: 150
problems and
solutions, G.
Laakmann, 5th edition,
CareersCup, 2011.
Recursión 5
Bibliografía
● Gödel, Escher,
Bach, Un eterno y
grácil bucle,
Douglas Hofstadter,
Tusquets,1987.
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
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
)
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
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
Recursión 10
Recursión
@ Josh Sommers
Recursión 11
Recursión
@ Josh Sommers
Recursión 12
Algoritmo
“Conjunto ordenado y finito de operaciones
que permite hallar la solución de un
problema.” (RAE )
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)
Recursión 14
Ejemplo - Fibonacci
● Los conejos no crían hasta los 2 meses
● Desde el mes 2, cada mes dan 1 cría
Recursión 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 16
Resolución : Recursivo vs
iterativo
Recursivo: la
función se llama a sí
misma
Iterativa: usamos un
bucle
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
Recursión 18
Mejora algoritmo recursivo
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”
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é?
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
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
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
Recursión 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 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 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)
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)
Recursión 28
Pila de llamadas (III)
Variable local n f(4) = 4 * 6 = 24
f(4)
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
Recursión 30
Recursión
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
Recursión 32
¿Preguntas?

Weitere ähnliche Inhalte

Was ist angesagt? (12)

Por que java
Por que javaPor que java
Por que java
 
Control de flujo bucles
Control de flujo buclesControl de flujo bucles
Control de flujo bucles
 
Sesión 2: Ejemplos y prácticas en Python
Sesión 2: Ejemplos y prácticas en PythonSesión 2: Ejemplos y prácticas en Python
Sesión 2: Ejemplos y prácticas en Python
 
Clase3_Python-CTIC
Clase3_Python-CTICClase3_Python-CTIC
Clase3_Python-CTIC
 
Recursividad Con C#
Recursividad Con C#Recursividad Con C#
Recursividad Con C#
 
Clase2_Python-CTIC
Clase2_Python-CTICClase2_Python-CTIC
Clase2_Python-CTIC
 
Algoritmos de Planeacion
Algoritmos de PlaneacionAlgoritmos de Planeacion
Algoritmos de Planeacion
 
Tema3
Tema3Tema3
Tema3
 
Optimización global
Optimización globalOptimización global
Optimización global
 
Presentacion bucle
Presentacion buclePresentacion bucle
Presentacion bucle
 
Tema4 programación generica
Tema4   programación genericaTema4   programación generica
Tema4 programación generica
 
Optimizacion de Compiladores
Optimizacion de CompiladoresOptimizacion de Compiladores
Optimizacion de Compiladores
 

Ähnlich wie Tema 1 Recursión

11 Recursion
11 Recursion11 Recursion
11 Recursion
UVM
 
Tema 3 ejercicios de numeros reales potencias-radicales
Tema 3   ejercicios de numeros reales potencias-radicalesTema 3   ejercicios de numeros reales potencias-radicales
Tema 3 ejercicios de numeros reales potencias-radicales
mgarmon965
 

Ähnlich wie Tema 1 Recursión (20)

Ud 1 4 metodos numericos 4ª presentacion
Ud 1 4 metodos numericos 4ª presentacionUd 1 4 metodos numericos 4ª presentacion
Ud 1 4 metodos numericos 4ª presentacion
 
Curso recursividad
Curso   recursividadCurso   recursividad
Curso recursividad
 
Funciones recursivas en C++
Funciones recursivas en C++Funciones recursivas en C++
Funciones recursivas en C++
 
Recursividad
RecursividadRecursividad
Recursividad
 
2. Recursividad
2. Recursividad2. Recursividad
2. Recursividad
 
Recursividad
RecursividadRecursividad
Recursividad
 
Recursividad
RecursividadRecursividad
Recursividad
 
Recursividad.pdf
Recursividad.pdfRecursividad.pdf
Recursividad.pdf
 
Funciones recursivas
Funciones recursivasFunciones recursivas
Funciones recursivas
 
Recursividad.pdf
Recursividad.pdfRecursividad.pdf
Recursividad.pdf
 
Recursividad 100329105433-phpapp01
Recursividad 100329105433-phpapp01Recursividad 100329105433-phpapp01
Recursividad 100329105433-phpapp01
 
Conceptos básicos de un lenguaje de programación
Conceptos básicos de un lenguaje de programaciónConceptos básicos de un lenguaje de programación
Conceptos básicos de un lenguaje de programación
 
11 Recursion
11 Recursion11 Recursion
11 Recursion
 
Procesos y Planificación de la CPU
Procesos y Planificación de la CPUProcesos y Planificación de la CPU
Procesos y Planificación de la CPU
 
Guía n° 05 Matemática IV
Guía n° 05 Matemática IVGuía n° 05 Matemática IV
Guía n° 05 Matemática IV
 
Tema 3 ejercicios de numeros reales potencias-radicales
Tema 3   ejercicios de numeros reales potencias-radicalesTema 3   ejercicios de numeros reales potencias-radicales
Tema 3 ejercicios de numeros reales potencias-radicales
 
Recursion
RecursionRecursion
Recursion
 
Pipelining
PipeliningPipelining
Pipelining
 
6.leccion9 metareglasy control
6.leccion9 metareglasy control6.leccion9 metareglasy control
6.leccion9 metareglasy control
 
Hibridación Iterativa de DE con BL con reinicio para alta dimensionalidad
Hibridación Iterativa de DE con BL con reinicio para alta dimensionalidadHibridación Iterativa de DE con BL con reinicio para alta dimensionalidad
Hibridación Iterativa de DE con BL con reinicio para alta dimensionalidad
 

Mehr von Carlos A. Iglesias

Tema 4.2 Desarrollo Android e instalacion
Tema 4.2 Desarrollo Android e instalacionTema 4.2 Desarrollo Android e instalacion
Tema 4.2 Desarrollo Android e instalacion
Carlos A. Iglesias
 

Mehr von Carlos A. Iglesias (20)

GSI Research Group Presentation
GSI Research Group PresentationGSI Research Group Presentation
GSI Research Group Presentation
 
Entorno PHP
Entorno PHPEntorno PHP
Entorno PHP
 
Bootstrap 3.
Bootstrap 3.Bootstrap 3.
Bootstrap 3.
 
Introducción CSS
Introducción CSSIntroducción CSS
Introducción CSS
 
Introducción HTML
Introducción HTMLIntroducción HTML
Introducción HTML
 
Presentación TEWC
Presentación TEWCPresentación TEWC
Presentación TEWC
 
UPM GSI Presentation
UPM GSI PresentationUPM GSI Presentation
UPM GSI Presentation
 
Introducción Análisis y Diseño
Introducción Análisis y DiseñoIntroducción Análisis y Diseño
Introducción Análisis y Diseño
 
PHP. Bases de Datos
PHP. Bases de DatosPHP. Bases de Datos
PHP. Bases de Datos
 
PHP. Tecnologías Web.
PHP. Tecnologías Web.PHP. Tecnologías Web.
PHP. Tecnologías Web.
 
1 intro php
1 intro php1 intro php
1 intro php
 
0 entorno php
0 entorno php0 entorno php
0 entorno php
 
Introducción TEWC
Introducción TEWCIntroducción TEWC
Introducción TEWC
 
Tema 4.1 Introduccion Android
Tema 4.1 Introduccion AndroidTema 4.1 Introduccion Android
Tema 4.1 Introduccion Android
 
Tema 4.2 Desarrollo Android e instalacion
Tema 4.2 Desarrollo Android e instalacionTema 4.2 Desarrollo Android e instalacion
Tema 4.2 Desarrollo Android e instalacion
 
Tema 4.3 Ejemplo sobre teleco
Tema 4.3 Ejemplo sobre telecoTema 4.3 Ejemplo sobre teleco
Tema 4.3 Ejemplo sobre teleco
 
Tema 4.4 Actividades
Tema 4.4 ActividadesTema 4.4 Actividades
Tema 4.4 Actividades
 
Tema 4.5 interfaces
Tema 4.5 interfacesTema 4.5 interfaces
Tema 4.5 interfaces
 
Tema 4.6 Intenciones
Tema 4.6 IntencionesTema 4.6 Intenciones
Tema 4.6 Intenciones
 
Tema 4.7 Acceso a datos
Tema 4.7 Acceso a datosTema 4.7 Acceso a datos
Tema 4.7 Acceso a datos
 

Kürzlich hochgeladen

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
FagnerLisboa3
 

Kürzlich hochgeladen (11)

Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 

Tema 1 Recursión

  • 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>
  • 2. Recursión 2 Teoría Ejercicio práctico en el ordenador Ampliación de conocimientos Lectura / Vídeo / Podcast Práctica libre / Experimentación Legenda
  • 3. Recursión 3 Bibliografía ● Libros: – Data Structures & Algorithms in Java, Robert Lafore, 2nd Edition, SAMS, capítulo 6, recursión, 2002
  • 4. Recursión 4 Biblografía Cracking the coding interview: 150 problems and solutions, G. Laakmann, 5th edition, CareersCup, 2011.
  • 5. Recursión 5 Bibliografía ● Gödel, Escher, Bach, Un eterno y grácil bucle, Douglas Hofstadter, Tusquets,1987.
  • 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
  • 12. Recursión 12 Algoritmo “Conjunto ordenado y finito de operaciones que permite hallar la solución de un problema.” (RAE )
  • 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
  • 15. Recursión 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
  • 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
  • 24. Recursión 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
  • 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)
  • 28. Recursión 28 Pila de llamadas (III) Variable local n f(4) = 4 * 6 = 24 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