Recursividad. Dept. Ciencias de la Computación e I.A. Universidad de Granada

Documentos relacionados
Recursividad. 1.1 Concepto de Recursividad. Objetivos. Metodología de la Programación II Entender el concepto de recursividad.

Tema 3. Recursividad.

Qué es la recursividad?

Programación I Recursividad.

ORDENAMIENTO Y BÚSQUEDA

Análisis de algoritmos. Recursividad

Tema 9. Recursividad

Recursividad. Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile

Programación 2. Lección 3. Introducción a la recursividad

Metodología de la Programación II. Recursividad

Estructura de datos y de la información Boletín de problemas - Tema 9

Complejidad de algoritmos recursivos

Programación de sistemas Recursión

Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2

Tema 5- Diseño Recursivo y. Objetivos Principales. Bibliografía Básica

TEMA 1. Recursividad. Recursividad CONTENIDO DEL TEMA

Recursividad Definición

Programación de sistemas

Recursividad. Definición de Recursividad: Técnica de programación muy potente que puede ser usada en lugar de la iteración.

<tipo> Tipo de dato de los elementos del vector

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

RECURSIVIDAD. Prof. Ing. M.Sc. Fulbia Torres

Este método se basa en buscar el elemento menor el vector y colocarlo en la primera

Tema: Funciones, Procedimientos y Recursividad en C#.

Tema: Funciones, Procedimientos y Recursividad en C#.

UNIDAD 7 Recursividad Concepto. Algoritmos recursivos. Seguimiento de la recursión. Algunos métodos recursivos de búsqueda y ordenación: M-Sort y

Soluciones a los ejercicios planteados en el curso

Si un número es múltiplo de otro, u dicho de forma, comprobar si un número es divisor de otro.

ESTRUCTURA DE DATOS: Tema 3. Recursividad

Tema 11. Diseño de algoritmos recursivos 1. Tema 11. Diseño de algoritmos recursivos

Tema: Funciones, Procedimientos y Recursividad en C#.

Fundamentos de la programación

Recursión. Recursión continuación

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 1: Recursividad. Prof. Montserrat Serrano Montero

ESTRUCTURA DE DATOS: Tema 3. Recursividad

Estructura de Datos. Recursividad. Primer Semestre, Indice

Unidad 2 Recursividad. 2.1 Definición 2.2 Procedimientos Recursivos 2.3 Ejemplos de Casos Recursivos

Departamento de Informática Universidad de Valladolid Campus de Segovia TEMA 1: RECURSIÓN

Solución - práctico 10

Análisis de algoritmos

Programación II. Mario Aldea Rivas Programación II 13/04/11 1. Mario Aldea Rivas Programación II 13/04/11 2

Algoritmos y Estructuras de Datos: Introducción a la Recursión de Programas. Guillermo Román Díez

Tema 3. Análisis de costes

Unidad 2 Recursividad. 2.1 Definición 2.2 Procedimientos Recursivos 2.3 Ejemplos de Casos Recursivos

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

Tema 1. Recursividad

Tema 7: Recursividad

Secuencias Calculadas

Técnicas de diseño de algoritmos Divide y Vencerás

Tecnología de la Programación

Tema 4.- Recursión e iteración

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

Programación Unidad 5. Recursividad. Programación TIG - TUP 1. Sede Regional Orán UNIVERSIDAD NACIONAL DE SALTA

Temario. Tipos de recursión. Eficiencia y recursión

Francisco J. Hernández López

RECURRENCIA RECURSIÓN o RECURSIVIDAD

Metodología de la Programación II. Recursividad

Trabajo Práctico Nº 06

7 INTRODUCCIÓN A LA RECURSIVIDAD.

Informática II Fundamentos de Programación Escuela Superior de Ingenieros de San Sebastián - Tecnun

Funciones recursivas

TECNICAS DE PROGRAMACION Universidad Católica Los Angeles de Chimbote RECURSIVIDAD Y SOBRECARGA DE METODOS

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

Funciones Tipos de funciones y Recursividad

Métodos de ordenamiento y búsqueda para datos en memoria principal

Estructuras de Datos y Algoritmos. Curso 2009/2010. Tema 3: Divide y Vencerás

4.1 Definición. Se dice que algo es recursivo si se define en función de sí mismo o a sí mismo. Un objeto (problemas, estructuras de datos) es

Modularización en lenguaje C. Funciones

Funciones recursivas

Métodos de ordenamiento y búsqueda para datos en memoria principal

Estructura de datos y de la información Boletín de problemas - Tema 10

Tema: Funciones, Procedimientos y Recursividad en C#.

Sorting++ Herman Schinca. Clase de Junio de 2011

Introducción al Análisis del Coste de Algoritmos

Tema 06: Recursividad

Algoritmos y Complejidad

Introducción. Algoritmos y Complejidad. Algoritmos y Algoritmia. Introducción. Problemas e instancias. Pablo R. Fillottrani

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

ESTRUCTURA DE DATOS: Tema 5. Ordenamiento y Búsqueda

Programación II Recursividad Dr. Mario Rossainz López

Ejemplo 73. Función recursiva para calcular el factorial de un número

dit UPM Tema 2: Algoritmos /ordenación /java Análisis y diseño de software José A. Mañas

Diseño de algoritmos recursivos 1

Vectores y Matrices. Dept. Ciencias de la Computación e I.A. Universidad de Granada

Luis Rodríguez Baena Universidad Pontificia de Salamanca Escuela Superior de Ingeniería y Arquitectura

Recursión. Carlos Delgado Kloos Ingeniería Telemática Univ. Carlos III de Madrid. Java: Recursión / 1

Estructura de Datos. Complejidad de Algoritmos. Algoritmo. Algoritmo. Mauricio Solar Lorna Figueroa

Funciones II. Fundamentos de Programación Fundamentos de Programación I

Tema: Métodos de Ordenamiento. Parte 3.

Algorítmica y Complejidad. Tema 3 Ordenación.

Tema: FUNCIONES, PROCEDIMIENTOS Y RECURSIVIDAD.

Programación Análisis de Algoritmos: Tiempo de Ejecución (Introducción)

Recursividad. Contenido. 1. Concepto de recursividad. 2. Funcionamiento de la recursividad. 3. Uso de la recursividad. 4. Ejemplos.

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

Trabajo Práctico Nº 13 Tema: RECURSIVIDAD

Recursividad... un análisis posterior. Aurelio Sanabria Introducción a la programación

Recursión. Introducción a la Computación Clase 15 Patricia Borensztejn

Recursividad. Definición. Diseño de Algoritmos Recursivos

Transcripción:

TEMA Recursividad Dept. Ciencias de la Computación e I.A. Universidad de Granada

Índice Introducción a la recursión Recursividad frente a iteración Eficiencia de los algoritmos recursivos Ejemplos y ejercicios

Definición Una función es recursiva cuando el concepto que se introduce está definido en base a si mismo Ejemplo: Factorial de un número n!= 1, si n=0 n!= n(n-1)!, si n 0 int factorial(int n){ if (n==0) return 1; else return n*factorial(n-1); Ejercicios: Define funciones recursivas para calcular la sumatoria de los n primeros naturales y la potencia de entero con exponente natural

Verificación de las funciones recursivas a. Debe haber, al menos, una posible llamada a la función que produce un resultado sin provocar una nueva llamada recursiva. A esto se le llama caso base de la recursión Ejemplo: Factorial de un número No es correcto int factorial(int n){ return n*factorial(n-1);

Verificación de las funciones recursivas b. Todas las llamadas recursivas se refieren a un caso que es más cercano al caso base Ejemplo: Factorial de un número n!=(n+1)!/(n+1) No es correcto (se verifica a) int factorial(int n){ if (n==0) else return 1; return factorial(n+1)/(n+1);

Verificación de las funciones recursivas c. El caso base debe acabar alcanzándose. Ejemplo: Factorial de un número n!=n(n-1)(n-2)! No es correcto si n impar (se verifica a y b) int factorial(int n){ if (n==0) else return 1; return n*(n-1)*factorial(n-2);

Funciones recursivas con caso base múltiple Sucesión de Fibonacci fib(1)=0, fib(2)=1, fib(n)=fib(n-1)+fib(n-2), para n 1 y n 2 Ejercicio: Implementar la función int fib(int n){ if (n==0) cout<< Error. No está definido ; else if (n==1) return 0; else if (n==2) return 1; else return fib(n-1)+fib(n-2);

Recursividad ante iteración Cualquier problema resuelto de forma recursiva puede ser resuelto de forma iterativa La forma recursiva suele usar sentencias de selección (if) La forma iterativa usa sentencias de iteración (for, while, do-while) En forma iterativa es necesario introducir variable locales La forma recursiva suele ser menos eficiente (en tiempo) que la iterativa pero mas simple

Ejemplos Resolución del factorial de forma iterativa int factorial(int n){ int i, resultado; resultado=1; for (i=2;i<=n;i++) resultado=resultado*i; return resultado; Ejercicios: Implementa de forma iterativa la recurrencia de Fibonacci

Ejemplos Resolución de los números de Fibonacci de forma iterativa int fib(int n){ int resultado, f1, f2, i; if (n==0) cout<< Error. No está definido ; else if (n==1) resultado = 0; else{ f1 = 0; resultado = 1; for (i=1; i<=n-2; i++){ f2 = f1; f1 = resultado; resultado = f1 + f2; return resultado;

Eficiencia de los algoritmos recursivos Los agoritmos recursivos suelen ser menos eficientes en tiempo que los iterativos. Motivos: 1. Cada llamada requiere tiempo para Hacer la llamada a la función Crear las variables locales y copiar los parámetros por valor Ejecutar las instrucciones en parte ejecutiva de la función Destruir las variables locales y parámetros por valor Salir de la función 2. Posible sobrecarga debido a la solución (ver Fibonacci)

Ejercicio 1 Realiza un subprograma que implemente la búsqueda lineal en forma recursiva int busqueda_lineal(int a[], int elemento, int primero, int tam){ if (primero > tam-1) return (-1); else if (a[primero] == elemento) return primero; else return busqueda_lineal(a,elemento,primero+1,tam);

Ejercicio 2 Realiza un subprograma que implemente la búsqueda binaria en forma recursiva int busqueda_binaria(int a[], int elemento, int primero, int ult){ int central; If (primero > ult-1) return (-1); else{ central = (primero + ult)/2; if (a[central] == elemento) return central; else if (a[central]>elemento) return busqueda_binaria(a,elemento,primero,central-1); else return busqueda_binaria(a,elemento,central+1,ult);

Ejercicio 3 Realiza un subprograma que implemente el método de ordenación por selección directa de forma recursiva void OrdSelRecursivo(int a[], int primero, int ultimo) { int i, PosMenor, aux; // Busca el menor elemento if (primero + 1 < ultimo) { PosMenor = primero; // Supone que el menor es el primero for (i = primero + 1; i < ultimo; i++) // Encuentra el menor if (a[i] < a[posmenor]) PosMenor = i; // Lleva a cabo el intercambio aux = a[primero]; a[primero] = a[posmenor]; a[posmenor] = aux; // Llamada recursiva a la función con el subvector OrdSelRecursivo(a, primero + 1,ultimo);

Quicksort I El algoritmo Quicksort fue desarrollado en 1962 por C.A.R. Hoare, antes de que se implementaran los primeros lenguajes con capacidad para ejecutar funciones recursivas. El algoritmo, aplicado a un (sub)vector vec[ini..fin] es: 1. Elegir un elemento p cualquiera del vector, entre ini y fin. El elemento p se llama pivote. Usualmente se elige el elemento que está en el medio. 2. Particionar el vector en dos subvectores: vec[ini..p] y vec[p+1..fin], intercambiando elementos de modo que todos los elementos que son menores que p estén a la izquierda y todos los mayores que p estén a la derecha. 3. Aplicar Quicksort al subvector vec[ini..p] 4. Aplicar Quicksort al subvector vec[p+1..fin]

Quicksort II La función que implementa el algoritmo Quicksort podría implementarse de la siguiente manera: /************************************************************************** * Función recursiva que ordena un vector de enteros mediante Quicksort. * Si el vector no tiene mas de dos elementos no se hace nada. De lo * contrario, se particiona el vector y se aplica el método a los dos * subvectores que resultan de la partición. * Se reciben como parámetros el vector y el índice inicial y final. **************************************************************************/ void QuickSort(int a[], int ini, int fin) { int p; if (ini < fin) { p = ParticionarVector(a, ini, fin); QuickSort(a, ini, p); QuickSort(a, p + 1, fin);

Quicksort III /************************************************************************** * Función para particionar un vector en dos subvectores, intercambiando * elementos de modo que todos los menores que el pivote estén a la * izquierda y los mayores a la derecha. * Se reciben como parámetros el vector y el índice inicial y final. * Se retorna el índice para particionar el vector (posición del pivote). **************************************************************************/ int ParticionarVector(int a[], int ini, int fin) { int pivote = a[(ini + fin) / 2]; int izq = ini - 1; int der = fin + 1; int aux; while (izq < der) { do {// Busca el 1er. elemento de la izq. para intercambiar izq++; while (a[izq] < pivote); do {// Busca el 1er. elemento de la derecha para intercambiar der--; while (a[der] > pivote); if (izq < der) {// Lleva a cabo el intercambio aux = a[izq]; a[izq] = a[der]; a[der] = aux; return(der); // der es la posición donde queda el mayor en el último cambio