Tema 9. Recursividad

Documentos relacionados
Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 4: Ordenación. Prof. Montserrat Serrano Montero

Tema 6. Gestión dinámica de memoria

Tema 5. Estructura de datos Pila

<tipo> Tipo de dato de los elementos del vector

Algoritmos Recursivos de Búsqueda y Ordenación y sus tiempos

Sorting++ Herman Schinca. Clase de Junio de 2011

Algoritmos de Ordenamiento

Problemas de Recursividad

Algoritmos de Ordenación

Metodología de la Programación II. Recursividad

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Análisis de Algoritmos

Complejidad de Algoritmos

Alonso Ramírez Manzanares Computación y Algoritmos 10.03

MATEMÁTICAS 5. º CURSO UNIDAD 1: SISTEMAS DE NUMERACIÓN

Algoritmos: Algoritmos sobre secuencias y conjuntos de datos

Capítulo 3 DIVIDE Y VENCERÁS

PROGRAMA DE ASIGNATURA DE PROGRAMACIÓN I

UNIDAD 1: NÚMEROS NATURALES OBJETIVOS

Ejemplo: El problema de la mochila. Algoritmos golosos. Algoritmos y Estructuras de Datos III. Segundo cuatrimestre 2013

Multiplicación de enteros Algoritmo clásico 1234*5678 = 1234* (5* *100+7*10+8) = 1234*5* *6* *7* *8 Operaciones bási

Analisis de algoritmos

Tema 5.- Recursividad

ÁREA: MATEMÁTICAS UNIDAD : 1 TEMPORALIZACIÓN: OCTUBRE 1ª QUINCENA OBJETIVOS CONTENIDOS CRITERIOS DE EVALUACIÓN

La eficiencia de los programas

INTRODUCCIÓN AL ESTUDIO DE ALGORITMOS Y SU COMPLEJIDAD

Algoritmos glotones. mat-151

Análisis de algoritmos

2007/ PROGRAMACIÓN. Tipo: TRO Curso: 1 Semestre: AB CREDITOS Totales TA TS AT AP PA OBJETIVOS. 1.-Introducción.

Ejemplo, generación de #s aleatorios

Complejidad de los Algoritmos

MATEMATICA GRADO 9 II PERIODO PROF. LIC. ESP. BLANCA NIEVES CASTILLO R. CORREO: cel

Jesús Manuel Carrera Velueta José Juan Almeida García Fecha de elaboración: Mayo 6 de 2010 Fecha de última actualización:

ORDENAMIENTO Y BÚSQUEDA EN ARREGLOS

Curso de Programación 1

Unidad 2. Los números enteros.

Algoritmos. Diseño de algoritmos por inducción. Alberto Valderruten. Dept. de Computación, Universidade da Coruña

Planificaciones Algoritmos y Programación II. Docente responsable: CALVO PATRICIA MABEL. 1 de 6

Tema 2. Recursividad. Fundamentos de Programación II. Luís Rodríguez Baena

Para las ecuaciones diferenciales ordinarias no lineales no existen métodos generales.

Matemáticas Universitarias

Métodos Numéricos (SC 854) Solución de ecuaciones no lineales. 1. Definición del problema: raíces de ecuaciones no lineales

Temario detallado. Conceptos generales de lenguajes y compiladores. Proceso de compilación de un programa en C++ bajo Code::Blocks

Estándares de Contenido y Desempeño, Estándares de Ejecución y Niveles de Logro Marcado* MATEMÁTICA

la solución a una ecuación cuadrática solicitando al usuario los términos de dicha ecuación.

7.4. UTILIDADES DE LAS PILAS

Recursión Directa. Una función es de recursión directa si contiene una llamada explícita a si misma. return foo (y 1); Recursión Indirecta

UNIDAD 1: NÚMEROS RACIONALES OBJETIVOS

PROGRAMACIÓN UNIDADES

Con miras a conocer la metodología que se aplica en el Método SIMPLEX, tenemos a continiacion un ejemplo:

a) Factoriza el monomio común. En este caso 6 se puede dividir de cada término:

Mostrar Números Ascendentemente. Soluciones Ejercicios Tema 5. tostring Recursivo de LEG. Suma Recursiva de un Vector (1/3)

Revisión Bibliográfica de la Representación de Problemas de la Técnica Divide y Vencerás

PLE: Ramificación y Acotamiento

Facultad De Ingeniería Programa de Ingeniería Industrial

Programación. Tema 8: Tablas Hash. Apuntes elaborados por: Eduardo Quevedo, Aaron Asencio y Raquel López Revisado por: Javier Miranda el????

Unidad 2: Ecuaciones, inecuaciones y sistemas.

MATEMÁTICAS 6 GRADO. Código de Contenido El alumno empleará la lectura, escritura y comparación de diferentes cantidades de cifras numéricas.

Antes de iniciar el tema se deben de tener los siguientes conocimientos básicos:

Especificación y uso de módulos en C++(II)

1 - Ecuaciones. Sistemas de Ecuaciones Mixtos

Creación de materiales didácticos Aplicaciones para dispositivos móviles Lección 3

Universidad Tec Milenio: Profesional IO04001 Investigación de Operaciones I. Tema # 9

COLEGIO HELVETIA PROGRAMA DE MATEMÁTICAS GRADO ONCE

TEMARIO PRESENTACIÓN 7 MÓDULO I 17 EXPRESIONES ALGEBRAICAS 19

PROGRAMACIÓN DE AULA MATEMÁTICAS 4º EP CENTRO EDUCATIVO LA AMISTAD. PLAN DE TRABAJO TRIMESTRAL MATEMÁTICAS 4º EP TRIMESTRE 1º REG0801 Pág.

Práctica 4 El algoritmo QuickSort, comparación de algoritmos de ordenación

Mapa Curricular: Funciones y Modelos

VI Colas de prioridad

Notación Asintótica 2

Tema: Métodos de Ordenamiento. Parte 1.

Carlos A. Rivera-Morales. Precálculo 2

PROGRAMACIÓN DE LOS CONTENIDOS DE MATEMÁTICAS EN LA PREPARACIÓN DE LA PARTE COMÚN DE LA PRUEBA DE ACCESO A LOS C.F.G.S. (Opción C)

Tema 8: Algoritmos de ordenación y búsqueda

Sesión No. 2. Contextualización. Nombre: Polinomios y expresiones racionales MATEMÁTICAS.

La segunda observación permite reformular el problema de una manera más simple:

LABORATORIO 3 ESTRUCTURAS REPETITIVAS WHILE / DO WHILE

UNIDAD ACADÉMICA PROFESIONAL TIANGUISTENCO

Guía práctica de estudio 05: Diagramas de flujo

Capítulo 2: Recursividad.

Método de diferencias finitas para ecuaciones diferenciales parciales elípticas. (Parte II)

Estructuras de control

3. Técnicas de diseño de algoritmos

Algoritmos y solución de problemas. Fundamentos de Programación Otoño 2008 Mtro. Luis Eduardo Pérez Bernal

Introducción a la Programación Dinámica. El Problema de la Mochila

DEPARTAMENTO DE MATEMÁTICAS MATEMÁTICAS 1º DE ESO PRIMER TRIMESTRE

Algoritmos de Búsqueda y Ordenación. Rosalía Laza Fidalgo. Departamento de Informática. Universidad de Vigo

Sistemas de ecuaciones no lineales

Lección 12: Sistemas de ecuaciones lineales

Estructuras de Repetición (Repita para)

OBRA SALESIANA DEL NIÑO JESÚS COLEGIO SALESIANO JUAN DEL RIZZO

4. OBJETIVOS General Desarrollar capacidades en el estudiante para interpretar problemas organizacionales mediante el uso del lenguaje matemático.

GUÍA DIDÁCTICA PROFESORADO. 1 er CICLO. NUMERACIÓN

Matemáticas financieras

ALGORITMO MINIMAX. o Nodo: Representa una situación del juego. o Sucesores de un nodo: Situaciones del juego a las que se

MODELOS LINEALES. Alejandro Vera Trejo

Programación de Sistemas

ELO320 Estructuras de Datos y Algoritmos. Arboles Binarios. Tomás Arredondo Vidal

COLEGIO AUGUSTO WALTE INFORMACIÓN DE ASIGNATURA I PERÍOD DESCRIPCIÓN DE CONTENIDOS

Transcripción:

Tema 9. Recursividad http://aulavirtual.uji.es José M. Badía, Begoña Martínez, Antonio Morales y José M. Sanchiz {badia, bmartine, morales, sanchiz@icc.uji.es Estructuras de datos y de la información Universitat Jaume I

Índice 1. Introducción 5 2. Tipos de recursividad 9 3. Implementación recursiva 12 4. Coste de algoritmos recursivos 13 5. Recursión frente a Iteración 18 6. Ordenación recursiva 19 6.1. Mergesort................................. 20 6.2. Quicksort.................................. 25

Tema 9. Recursividad 3 / 30 Bibliografía (Nyhoff 99), Capítulo 10 y apartados 13.3 y 13.4. (Main y Savitch 01), capítulos 9 y 13. LISP. Introducción al cálculo simbólico. D.S. Touretzky. Díaz de Santos, 1986. capítulo 8. Apuntes de "Metodología y tecnología de la programación".

Tema 9. Recursividad 4 / 30 Objetivos Aprender a interpretar algoritmos recursivos. Aprender a resolver problemas sencillos de forma recursiva. Aprender a calcular el coste de algoritmos recursivos. Conocer los principales algoritmos recursivos de ordenación.

Tema 9. Recursividad 5 / 30 1 Introducción Definición Un algoritmo es recursivo cuando se llama a sí mismo, directa o indirectamente. Ejemplo i n t sumatorio ( i n t n ) { i n t s ; i f ( n = = 1 ) return 1 ; else { s = sumatorio ( n 1 ) ; s = n + s ; return s ;

Tema 9. Recursividad 6 / 30 1 Introducción (II) Consideraciones La solución del problema se expresa en función de la solución de un subproblema del mismo tipo de menor tamaño o más simple. El proceso se repite varias veces de modo recursivo. La recursión se para cuando encontramos un subproblema con solución trivial: condición de parada. El algoritmo recursivo consta de dos fases que se desarrollan en "direcciones" contrarias: Aplicación de la recursión Retorno de la recursión

Tema 9. Recursividad 7 / 30 1 Introducción (III) Estructura de un algoritmo recursivo Todo algoritmo recursivo consta de dos partes: 1. Resolución del caso base. Se aplica cuando se cumple la condición de parada. Se resuelve de modo trivial. 2. Realización de la/s llamada/s recursiva/s. Se llama a la función en un caso más simple. En ocasiones se realiza alguna operación adicional antes o después. Recursión infinita

Tema 9. Recursividad 8 / 30 1 Introducción (IV) Utilidad de la recursividad Ventajas Da lugar a soluciones simples de problemas complejos. Da lugar a algoritmos simples. Inconvenientes Los algoritmos recursivos suelen ser difíciles de entender. Son más costosos en tiempo y espacio que sus versiones iterativas.

Tema 9. Recursividad 9 / 30 2 Tipos de recursividad Directa vs. Indirecta Directa: El algoritmo recursivo se llama a sí mismo. Indirecta: El algoritmo recursivo llama a otro que provoca eventualmente una llamada al original. Final vs. No final Final: Al finalizar la llamada recursiva, no queda ninguna acción por ejecutar salvo retornar. No final: Después de la llamada recursiva quedan acciones por realizar.

Tema 9. Recursividad 10 / 30 2 Tipos de recursividad (II) Sumatorio con recursividad indirecta i n t suma2 ( i n t n ) ; i n t suma1 ( i n t n ) { i f ( n = = 1 ) return 1 ; else return suma2 ( n ) ; i n t suma2 ( i n t n ) { return ( n + suma1 ( n 1 ) ) ;

Tema 9. Recursividad 11 / 30 2 Tipos de recursividad (III) Sumatorio con recursividad final void sumaf ( i n t n, i n t & res ) { i f ( n = = 1 ) res = res + n ; else { res = res + n ; sumaf ( n 1, res ) ;... i n t n =10, res =0; sumaf ( n, res ) ;

Tema 9. Recursividad 12 / 30 3 Implementación recursiva Intentar plantear la solución del problema en función de la solución de un subproblema del mismo tipo. Factorial: n! = n (n 1)! Sumatorio: n i=1 i = n + n 1 i=1 i Máximo: máx i:1...n {v[i] = maximo(v[n],máx i:1...n 1 {v[i]) Encontrar uno o varios casos en los que la solución sea trivial: casos base condición/es de parada. Factorial: 0! = 1 y 1! = 1 Sumatorio: 1 i=1 i = 1 Máximo: máx i:1...1 {v[i] = v[1]

Tema 9. Recursividad 13 / 30 4 Coste de algoritmos recursivos El coste de un algoritmo recursivo puede expresarse como una ecuación recursiva. La función t(n) representará el número total de pasos básicos. Ejemplo: Cálculo del sumatorio: t(n) = 1 si n = 1 1 +t(n 1) si n > 1 Obtenemos una ecuación no recursiva desplegando la ecuación anterior. t(n) = 1 +t(n 1) = 1 + 1 +t(n 2)... = = k veces {{ 1 + 1 +... + 1+t(n k) (k = n 1) n veces {{ 1 + 1 +... + 1 = n O(n)

Tema 9. Recursividad 14 / 30 4 Coste de algoritmos recursivos (II) Búsqueda dicotómica recursiva i n t buscadicr ( f l o a t v [ ], i n t desde, i n t hasta, f l o a t buscado ) { i n t centro ; i f ( desde > hasta ) return 1; else { centro = ( desde + hasta ) / 2 ; i f ( v [ centro ] = = buscado ) return centro ; else i f ( v [ centro ] > buscado ) return buscadicr ( v, desde, centro 1, buscado ) ; else return buscadicr ( v, centro +1, hasta, buscado ) ;

Tema 9. Recursividad 15 / 30 4 Coste de algoritmos recursivos (III) Búsqueda dicotómica recursiva. Coste en el caso peor t(n) = 1 si n = 1 1 +t( n 2 ) si n > 1 t(n) = 1 +t(n/2) = 1 + 1 +t(n/4)... = = k veces {{ 1 + 1 +... + 1+t(n/2 k ) (k = log 2 n) 1+log 2 n veces {{ 1 + 1 +... + 1 = 1 + log 2 n O(log 2 n)

Tema 9. Recursividad 16 / 30 4 Coste de algoritmos recursivos (IV) Números de Fibonacci F 1 F 2 F 3 F 4 F 5 F 6 F 7... F i 1 1 2 3 5 8 13... F i 1 + F i 2 F n = 1 si n = 1 ó n = 2 F n 1 + F n 2 si n > 2 i n t f i b o n a c c i ( i n t n ) { i f ( ( n = = 1 ) ( n = = 2 ) ) return 1 ; else return f i b o n a c c i ( n 1) + f i b o n a c c i ( n 2);

Tema 9. Recursividad 17 / 30 4 Coste de algoritmos recursivos (V) Fibonacci: t(n) = 1 si n = 1 ó n = 2 1 +t(n 1) +t(n 2) si n > 2 t(n) = 1 +t(n 1) +t(n 2) 1 + 2 t(n 1) = 1 + 2 (1 +t(n 2) +t(n 3)) 1 + 2 (1 + 2 t(n 2)) = 1 + 2 + 2 2 t(n 2)... = 1 + 2 + 2 2 +... + 2 k t(n k) (k = n 2) = n 2 2 i = 2 n 1 1 O(2 n ) : exponencial!!! i=0

Tema 9. Recursividad 18 / 30 5 Recursión frente a Iteración Todo algoritmo recursivo tiene una versión iterativa. i n t f a c t _ i t e ( i n t n ) { i n t res = 1 ; for ( i n t i = 1 ; i <=n ; i ++) res = res i ; return res ; Inconveniente: Suele ser más largo y complicado. Ventaja: Tiene un coste espacial y temporal inferior. i n t f a c t _ r e c ( i n t n ) { i f ( n = = 0 ) return 1 ; else return n f a c t _ r e c ( n 1);

Tema 9. Recursividad 19 / 30 6 Ordenación recursiva Aplican un esquema divide y vencerás 1. Dividir los elementos a ordenar en dos grupos de dimensión similar. 2. Ordenar cada uno de los grupos. Posiblemente aplicando recursivamente el mismo esquema de división. 3. Combinar los dos grupos ordenados en uno mayor. Tienen un coste medio O(nlog 2 n) Heapsort Mergesort Quicksort

Tema 9. Recursividad 20 / 30 6.1 Mergesort Idea general 1. Dividir el vector en dos partes iguales o casi iguales. 2. Ordenar cada subvector usando, por ejemplo, mergesort. 3. Mezclar los subvectores ordenados en uno solo. Dividir Ejemplo. Una etapa 9 12 31 25 5 8 20 2 36 Ordenar subvectores 5 9 12 25 31 2 8 20 36 Mezclar 2 5 8 9 12 20 25 31 36

Tema 9. Recursividad 21 / 30 6.1 Mergesort (II) Algoritmo mergesort void mergesort ( i n t v [ ], i n t n ) { i f ( n > 1 ) { / / D i v i s i ó n y Ordenación r e c u r s i v a de l o s subvectores mergesort ( v, n / 2 ) ; mergesort ( v+n / 2, n n / 2 ) ; / / Mezcla de l o s subvectores ordenados merge ( v, n / 2, v+n / 2, n n / 2 ) ;

Tema 9. Recursividad 22 / 30 6.1 Mergesort (III) Algoritmo de mezcla Mientras queden elementos por r e c o r r e r en ambos subvectores Comparar l o s dos elementos actuales de ambos. Copiar e l elemento menor en e l v e c tor a u x i l i a r. Mover e l í n d i c e del a u x i l i a r y del v e ctor con e l elemento menor. f i n m i e n t r a s Copiar l o s elementos r e s t a n t e s del v e c t or no vacío en e l a u x i l i a r. Copiar l o s elementos del a u x i l i a r en e l o r i g i n a l.

Tema 9. Recursividad 23 / 30 6.1 Mergesort (IV) Algoritmo merge void merge ( i n t v [ ], i n t nv, i n t w [ ], i n t nw ) { i n t i =0, j =0, k =0, vaux = new i n t [ nv+nw ] ; while ( ( i < nv ) & & ( j < nw ) ) i f ( v [ i ] < w[ j ] ) vaux [ k + + ] = v [ i + + ] ; else vaux [ k + + ] = w[ j + + ] ; while ( i < nv ) vaux [ k + + ] = v [ i + + ] ; while ( j < nw ) vaux [ k + + ] = w[ j + + ] ; for ( k = 0 ; k < nv+nw ; k ++) v [ k ] = vaux [ k ] ; delete [ ] vaux ;

Tema 9. Recursividad 24 / 30 6.1 Mergesort (V) Coste de mergesort: t(n) = Coste de merge: O(n) 1 si n = 1 1 +t(n/2) +t(n/2) + coste de merge si n > 1 t(n) = 1 +t(n/2) +t(n/2) + O(n) = 1 + 2 t(n/2) + O(n) = 1 + 2 (1 +t(n/4) +t(n/4) + O(n/2)) + O(n) = 1 + 2 + 2 2 t(n/2 2 ) + 2 O(n) = 1 + 2 + 2 2 (1 +t(n/2 3 ) +t(n/2 3 ) + O(n/2 2 )) + 2 O(n) =... = k 1 2 i + 2 k t(n/2 k ) + k O(n) i=0 = 2 k 1 + 2 k t(n/2 k ) + k O(n) (k = log 2 n) = (n 1) + n + O(nlog 2 n) O(nlog 2 n)

Tema 9. Recursividad 25 / 30 6.2 Quicksort Idea general 1. Elegir un elemento del vector como pivote. 2. Dividir el vector original en un subvector v con los elementos menores que el pivote y otro w con los elementos mayores. 3. Ordenar ambos subvectores, por ejemplo, utilizando quicksort. 4. Devolver el vector resultante de concatenar: v, pivote, w.

Tema 9. Recursividad 26 / 30 6.2 Quicksort (II) Algoritmo quicksort void q u i c k s o r t ( i n t v [ ], i n t primero, i n t u l t i m o ) { i n t pos ; / / p o s i c i ó n d e f i n i t i v a del p i v o t e i f ( primero < u l t i m o ) { / / v e c t o r con más de un elemento / / Elección del p i v o t e y D i v i s i ó n en dos subvectores pos = D i v i d i r ( v, primero, u l t i m o ) ; / / Ordenación de l o s subvectores q u i c k s o r t ( v, primero, pos 1); q u i c k s o r t ( v, pos +1, u l t i m o ) ;

Tema 9. Recursividad 27 / 30 6.2 Quicksort (III) Algoritmo de división E l e g i r e l elemento p i v o t e ( p. e. e l primero del v ector ). Recorrer e l vector desde l a i z q u i e r d a y l a derecha a l a vez Buscar desde l a derecha un elemento menor o i g u a l que e l p i v o t e. Buscar desde l a i z q u i e r d a un elemento mayor que e l p i v o t e. I n t e r c a m b i a r ambos elementos. Hasta que coincidan o se hayan cruzado ambas posiciones. I n t e r c a m b i a r e l p i v o t e y e l elemento en e l que f i n a l i z ó e l r e c o r r i d o desde l a derecha.

Tema 9. Recursividad 28 / 30 6.2 Quicksort (IV) Algoritmo de división i n t D i v i d i r ( i n t v [ ], i n t primero, i n t u l t i m o ) { i n t p i v o t e =v [ primero ], i z q =primero, der= u l t i m o ; while ( i z q < der ) { while ( v [ der ] > p i v o t e ) der ; while ( ( i z q < der ) & & ( v [ i z q ] < = p i v o t e ) ) i z q ++; i f ( i z q < der ) I n t e r c a m b i a r ( v [ i z q ], v [ der ] ) ; I n t e r c a m b i a r ( v [ primero ], v [ der ] ) ; return der ; / / p o s i c i ó n en que ha quedado e l p i v o t e

Tema 9. Recursividad 29 / 30 6.2 Quicksort (V) Quicksort: t(n) = Coste de dividir: O(n) 1 si n = 0 ó n = 1 1 +t(n ) +t(n ) + coste de dividir si n > 1 Caso peor: vector ordenado: (n = 0 y n = n 1) o (n = n 1 y n = 0) t(n) = 1 +t(0) +t(n 1) + O(n) = 1 + 1 + (1 +t(0) +t(n 2) + O(n 1)) + O(n) = 4 +t(n 2) + O(n 1) + O(n) = 4 + (1 +t(0) +t(n 3) + O(n 2)) + O(n 1) + O(n) =... = 2 k +t(n k) + O(n k + 1) +... + O(n) (k = n 1) = n 2 (n 1) +t(n (n 1)) + O(i) i=2 = 2 (n 1) + 1 + O(n 2 /2) O(n 2 ) : cuadrático!!

Tema 9. Recursividad 30 / 30 6.2 Quicksort (VI) Caso mejor: en cada etapa n n n/2 Selección del pivote: t(n) = 1 +t(n/2) +t(n/2) + O(n) = 1 + 2 t(n/2) + O(n) = 1 + 2 (1 +t(n/4) +t(n/4) + O(n/2)) + O(n) = 1 + 2 + 2 2 t(n/2 2 ) + 2 O(n)... = k 1 2 i + 2 k t(n/2 k ) + k O(n) (k = log 2 n) i=0 = (n 1) + n + O(nlog 2 n) O(nlog 2 n) Mediana de los elementos del vector. Mediana de tres elementos aleatorios del vector.