Estructura de Datos Unidad 4. Recursividad Dra. María Lucía Barrón Estrada Enero-Junio 2007.

Slides:



Advertisements
Presentaciones similares
2. Manejo de memoria Manejo de memoria estática
Advertisements

5. Estructuras no lineales estáticas y dinámicas
Métodos y parámetros.
Complejidad Computacional
Complejidad Computacional
Complejidad Computacional
Diseño y análisis de algoritmos
Paricial IV Ing. Esmeralda Elizabeth Rodríguez Rodríguez
Modularidad Estructura de datos.
Archivos Implementar un método que lea una secuencia de números enteros de un archivo y compute la cantidad de elementos leídos.
Curso de Java Estructura del Lenguaje
Genéricos en Java Jaime Ramírez, Ángel Lucas González
Tratamiento de listas en Java
2.3 Cola de números enteros.
2.2 Pila de números enteros
UNIVERSIDAD LATINA (UNILA)
UNIVERSIDAD LATINA (UNILA) II.- ANALISIS DE ALGORITMOS
/*Desarrollar una solución que permita ingresar y almacenar el promedio de prácticas, la nota del examen parcial y la nota del examen final de todos.
Introducción a la Computación (7ma Semana) Lunes 16 de Abril del 2007
Introducción a la Computación (8va Semana) Lunes 23 de Abril del 2007
Algoritmo y Estructura de Datos I
¿Qué es un algoritmo? “(del árabe al-Khowârizmî, sobrenombre del célebre matemático árabe Mohámed ben Musa). Conjunto ordenado y finito de operaciones.
Facultad de Ingeniería y Arquitectura Introducción a la Computación 2006 – II (8va Semana) Lunes 25 de Setiembre del 2006 Juan José Montero Román.
Facultad de Ingeniería y Arquitectura Introducción a la Computación 2006 – II (7ma Semana) Lunes 18 de Setiembre del 2006 Juan José Montero Román.
Oscar Bedoya. Edificio 331, 2º piso, E.I.S.C. Estructuras de datos y algoritmos.
Arreglos: Vectores en JAVA
Excepciones y archivos Info 033. Exception El término Exception es la palabra corta para la frase "evento excepcional." Definition: Una excepción es un.
Método en Java.
Recursión Se dice que un método es recursivo si forma parte de sí mismo o se define en función de sí mismo. La recursión es un medio particularmente poderoso.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
Programación I Teoría VI: Recursividad
Introducción a la Programación Orientada a Objetos Redefinición y Sobrecarga Dada la siguiente jerarquía de clases: Alfa Delta Beta.
Java. Objeto Es la instancia de una clase. Cada objeto se crea utilizando la palabra reservada new. Un objeto es conocido como una instancia. Ejemplo.
Realizado por: Bertha Palomeque A. Rodrigo Barzola J. Sensor de Temperatura utilizando el Starter Kit Javelin Stamp.
Estructuración y modularidad de los programas Fundamentos de Programación/ Programación I
Polimorfismo Lenguajes de Programación II Corporación Universitaria del Caribe CECAR.
Java Orientado a Objetos CLASES,OBJETOS Y MÉTODOS
El patrón de diseño Proxy Raúl Heras Alberto Blasco José Manuel Arévalo.
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
Unidad I Java y C++ : Similitudes y diferencias
Public class MiClase { public static int tmp = 123; // miembro variable public static final double PI = ;// miembro constante public float.
USA agenda e itemAgenda
Ecuaciones de recurrencia
Clase Teórica No. 4 Programación IV
Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.
Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.
Repaso/resumen 1.lectura/escritura y asignación 2.funciones 3.selección de instrucciones (if-else) 4.repetición de instrucciones (while) 5.recursión 6.operadores/instrucciones.
3.  Recursividad.

Introducción al análisis de algoritmos
Algoritmos.
Programación Orientada a Aspectos (POA)
Capítulo 1 “Elementos de Programación”
Patrones Creacionales
Capítulo 5 - b: Hilos. 4.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts – 7 th edition, Jan 23, 2005 Ejemplo de hilos: un applet Un.
Material de apoyo Unidad 4 Estructura de datos
Análisis de algoritmos
Parte II. Algorítmica. 5. Backtracking. 1. Análisis de algoritmos.
Estructuras de control Resolución de problemas y algoritmos.
Conceptos Avanzados de Programación
Oscar Bedoya. Edificio 331, 2º piso, E.I.S.C. Estructuras de datos y algoritmos.
Ing. Betty Suárez Torres
Entrada y Salida ES.leerChar (); ES.leerEntero (); ES.leerEnteroLargo (); ES.leerFloat (); ES.leerDouble (); System.out.print System.out.println.
Capítulo 2 “Subprogramas/Funciones - Arreglos”
Conalep Coacalco Algoritmos Recursivos
Introducción a los TADs
Encapsulamiento Miguel Ángel Rojas Aguilar Esthela Carmina Carranza Cabrera.
QUE ES PNL. CONCEPTO La programación neurolingüística es un proceso mental, mediante el cual utilizamos los sentidos con los cuales percibimos el mundo,
Recursividad.
Transcripción de la presentación:

Estructura de Datos Unidad 4. Recursividad Dra. María Lucía Barrón Estrada Enero-Junio 2007

4. Recursividad Definición Procedimientos recursivos Mecánica de recursión Transformación de algoritmos recursivos a iterativos Recursividad en el diseño Complejidad de los algoritmos recursivos

Definición Un método es recursivo si esta parcialmente definido en términos de si mismo. Un método recursivo permite la definición de soluciones mas cortas y eficientes. Ejemplo: definición de la función factorial N! = 1 para N=0 o N=1 N! = N*(N-1)! para N>1

Tipos de recursión Directa. El método contiene al menos una llamada a si mismo. Indirecta. Existe una secuencia de llamadas a métodos donde al menos una de estas llega al método inicial. // recursion indirecta public static int que(int n) { if (n <= 1) return n; else if (n mod 2 ==0) return magia((int)n/2); else return 1+magia(n*3+1); } public static int magia(int n) { if (n==1) return 1; if ((n mod 2)==1) return que(n-1); else return que((int)n/2); // recursión directa public static int factorial(int n) { if (n<=1) return 1; else return n*factorial(n-1); }

Procedimientos recursivos Visualizar todos los archivos almacenados en un disco. Definir una expresión en la gramática de un lenguaje de programación. Mostrar a todos los miembros de una familia representados en un árbol genealógico. Sumar todos los elementos de una lista de datos. Etc.

Mecánica de recursión Un método recursivo contiene dos elementos básicos que son fundamentales para su funcionamiento. Caso Base: Existe al menos una solución para algún valor determinado. Progreso: Cualquier llamada a si mismo debe progresar (acercarse) a un caso base. Define los elementos básicos de los ejemplos de la lamina anterior.

Demostración por inducción matemática La inducción matemática es una técnica para demostrar teoremas. Esta técnica puede ser usada para demostrar que los algoritmos recursivos funcionan correctamente. Algunas aplicaciones son demostraciones de teoremas que cumplen los números enteros positivos.

Ejemplo La suma de los primeros n números enteros positivos esta dada por los siguientes elementos básicos: Caso base: 1 cuando n=1 Progreso: n+suma de los primeros n-1 enteros positivos // suma de enteros recursiva int suma(int n){ if (n==1) return 1; else return n+suma(n-1); }

Demostración por inducción matemática Fórmula matemática n i= n(n+1)/2 i=1 Σ Demostración por inducción matemática Demostrar el caso base: es obvio que cuando n=1 el resultado=1 Asumir la hipótesis como válida para todos los valores de n>1 Demostrar que la fórmula el valida para n+1 1(1+1)/2 1(2)/2 2/2 1 n i= n(n+1)/2 i=1 Σ n+1 i= i=1 Σ n n+1 + i

Σ Σ n n+1 + i= (n+1) + n(n+1)/2 = n+1 + (n2 +n)/2 = (2n +2 + n2+ n)/2

Implementación de la recursión En muchos lenguajes de programación, las funciones, procedimientos o métodos recursivos se solucionan (ejecutan) mediante una pila de registros de activación. Un registro de activación de un método contiene el estado actual de todas las variables definidas en el.

Class SumaEnteros // suma de enteros recursiva static int suma(int n){ if (n==1) return 1; else return n+suma(n-1); } public static void main(String[] args){ System.out.println(“Suma de los primeros 5 numeros enteros ”+suma(5)); suma(1) suma(2) suma(3) suma(4) suma(5) Pila de registros de activación de los métodos main()

Demasiada recursión?? La ejecución de métodos recursivos consume tiempo y espacio además de limitar el valor de n para el cual se puede ejecutar el programa. La recursión debe evitarse si es posible usar un ciclo repetitivo. Una función recursiva para calcular los números de Fibonacci realizará una multitud de cálculos repetidos. // Funcion fibonacci public static int fib(int n) { if (n==1) return 0; else if (n==2) return 1; else return fib(n-1)+fib(n-2); } Construye el árbol de llamadas para fib(5)

Transformación de algoritmos recursivos a iterativos Cuando una función realiza una sola llamada recursiva, el árbol que representa su ejecución se muestra como una cadena donde cada vértice tiene un solo hijo. Este árbol puede convertirse en un programa iterativo que ahorra espacio y tiempo de ejecución. n n-1 n-2 n-3 1 2

Soluciones para transformar el método: El método para calcular los números de Fibonacci genera una estructura de árbol de dos hijos, no de una cadena. Soluciones para transformar el método: Solución 1. Mantener la información calculada hasta el momento y utilizarla si es necesario. Calcular y almacenar la información que no esta en la tabla Solución 2. Escribir un método iterativo que use variables temporales que “muevan” sus valores entre ellas para calcular nuevos números. 5 4 3 1 2

Ejemplo: Las torres de Hanoi Juego definido en el siglo XVII en Europa. Elementos: tres postes. n discos de diferentes tamaños. Reglas: Mover los n discos del poste A al poste C usando el poste B como intermediario. Solo se puede mover un disco a la vez. Ningún disco puede colocarse encima de otro más pequeño.

Como se puede mover el disco más grande? 3 2 1 Poste A Poste B Poste C Mover primero los discos mas pequeños dejando libre el poste final. 3 2 1 Poste A Poste B Poste C mueve (discos, inicio, ayuda, final){ if (discos > 0) { mueve(discos-1, inicio, final, ayuda) S.o.p(“mueve de “+inicio +” a ”+ayuda) mueve(discos-1, final, ayuda, inicio) } 3 2 1 Poste A Poste B Poste C

Ejercicio Cuantos movimientos de discos se requieren para: Mover 1 disco? Mover 2 discos? Mover 3 discos? Mover 4 discos? Mover n discos?

Ejercicio Cuantos movimientos de discos se requieren para: Mover 1 disco? Mover 2 discos? Mover 3 discos? Mover 4 discos? Mover n discos?

T(hanoi) = O(2n) S(hanoi) = O(n) N=3 N=2 N=2 N=1 N=1 public class Hanoi{ static int contar =0; public static void mover (int disco, int a, int b, int c){ contar++; if (disco == 1) System.out.println("Mueve el disco "+disco +" del poste: "+a + " al poste: "+b); else{ mover(disco-1, a,c,b); mover(disco-1, c,b,a); } public static void main(String[] args){ System.out.println("Inicia el movimiento de "+ 3 +" discos "); mover(3,1,3,2); System.out.println("Total de entradas a Mover "+contar); T(hanoi) = O(2n) S(hanoi) = O(n) N=2 N=1 N=3 N=2 N=1

Analisis de complejidad El análisis de complejidad de tiempo y espacio de algoritmos recursivos depende de dos factores: La profundidad (el número de niveles) de las llamadas recursivas hechas antes de llegar a la terminación. A mayor profundidad, mayor espacio y tiempo de ejecución. La cantidad de recursos consumidos en cada nivel de la recursión.

La ejecución de un programa se puede diagramar trazando la ruta de ejecución y creando una jerarquía con la llamada inicial en el tope. El diagrama resultante puede utilizarse para analizar el tiempo y el espacio del algoritmo.

Proyecto 3 Proyecto individual. Fecha de entrega: 9 de mayo 2008 Desarrolla un programa para implementar el juego de las torres de Hanoi. El programa deberá leer el numero de discos iniciales, la torre inicial y la torre final. Como salida, deberás obtener un archivo de texto con un listado de los movimientos de cada disco, así como el numero de discos que recibió cada poste.