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

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

Programación 1 Tema 5. Instrucciones simples y estructuradas

Programación 1 Tema 5. Instrucciones simples y estructuradas

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

Ámbito y Funciones. Lenguaje de Programación Estructurado. Siempre imaginé el Paraíso como algún tipo de biblioteca.

Programación 1. Tema II. Diseño de programas elementales. Lección 7. Diseño modular y descendente de programas

Funciones: Pasos por Referencia Recursividad

Fundamentos de la programación

Programación 1. Tema II. Diseño de los primeros programas. Lección 4. Diseño de algunos programas elementales

Programación 1 Tema 7. Desarrollo modular y descendente de programas

Programación 1 Problemas 3. Composición condicional

Tema 7: Recursividad

Programación I Recursividad.

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

Cátedra I Informática Autor I Carlos Bartó

Cátedra I Informática Autor I Carlos Bartó

Programación 1 Problemas del Composición condicional

Estructura de Datos. Recursividad. Primer Semestre, Indice

Programación 1. Tema II. Diseño de programas elementales. Lección 7. Diseño modular y descendente de programas

Funciones Tipos de funciones y Recursividad

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

1. Qué se muestra en pantalla si se ejecutan las siguientes sentencias (suponiendo que el resto del programa que no se presenta es correcto)?

Programación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 1. Problemas de tratamiento de información, algoritmos y programas

UNIVERSIDAD POLITÉCNICA DE MADRID. Actividad 1. Manejo del entorno de desarrollo (IDE).

Fundamentos de la programación

Programación 1 Tema 3. Información, datos, operaciones y expresiones

Complejidad de algoritmos recursivos

Fundamentos de la programación

Ejercicios De Programación De C++ Algoritmos. Lenguaje De Programación C++:

Programación 1 Tema 4. Diseño de programas elementales

Un Poco Sobre Programación Recursiva

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

Tema: Plantillas en C++.

Secuencias Calculadas

dit UPM Tema 1: Introducción /recursión Análisis y diseño de software José A. Mañas

Qué es la recursividad?

Programación 1 Tema II Clase de problemas. Diseño de programas elementales

Clase 2: Tipos de Datos y Condiciones. Profesora de Cátedra: Jocelyn Simmonds

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

Sentencias de Procesamiento Iterativo: while y do-while

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

Dobles: Es el caso de la instrucción if-else (punto 1.2).

Programación de sistemas Recursión

PROGRAMACIÓ 1! 1. Entendre el concepte de recursivitat. 2. Saber dissenyar algorismes recursius senzills i implementar-los en llenguatge C.

Estructuración del programa en partes más pequeñas y sencillas

Lenguaje de Programación: C++ Repaso de Material C++

Introduccion a C++ y Fortran 90/95

Examen Principios de Programación Febrero 2012

Tema: FUNCIONES, PROCEDIMIENTOS Y RECURSIVIDAD.

Unidad 2. La lógica de programación. Tema 4. Arreglos y estructuras de repetición

Examen de prácticas de Programación 1

Introducción a C++ Algoritmos y Estructuras de datos II Dra. Carmen Mezura Godoy. Febrero 2009

Análisis de algoritmos. Recursividad

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

Lista de Cotejo. Práctica # 21 Calculo de Volumen de Figuras Geométricas

Capítulo 4. Control de flujo. Continuar

Programación Dinámica

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

Bloque 3. Expresiones, sentencias y estructuras de control

Programación de sistemas

M.C. Yolanada Moyao Martínez

Lenguaje de Programación: C++ Directivas al preprocesador

Facultad de Ciencias de la Computación. Abraham Sánchez López Grupo MOVIS

Lista de Cotejo. Práctica # 11 Uso de Sentencias Bucle While

La Herencia. La primera línea de cada declaración debe incluir la sintaxis siguiente:

ALMACENAMIENTO PERSISTENTE DE DATOS

Macros LENGUAJE DE PROGRAMACIÓN ESTRUCTURADO

FUNDAMENTOS PARA LA CONSTRUCCIÓN DEL CÓDIGO A PARTIR DEL ALGORITMO

República Bolivariana de Venezuela Aldea Universitaria Liceo Fray Pedro de Agreda Trayecto II Desarrollo de Software

dit UPM Tema 1: Algoritmos /complejidad /java Análisis y diseño de software José A. Mañas

República Bolivariana de Venezuela Aldea Universitaria Fray Pedro de Agreda PNFSI. Introducción a lenguaje C++. Parte IV Ciclos iterativos

Tema: Funciones Virtuales y Polimorfismo.

Tema: Funciones Virtuales y Polimorfismo.

TEMA 4: Programación estructurada

PRECISO, DETERMINÍSTICOS Y FINITOS.

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

#include <stdio.h> float cubica(float numero) { float cubica; cubica = numero * numero * numero; return cubica; }

// el módulo tiempo // el módulo subtitulo // el módulo herramientas

TEMA 4: Estructuras de Control

UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO CENTRO UNIVERSITARIO UAEM ATLACOMULCO INGENIERÍA EN COMPUTACIÓN

Lenguaje de Programación: C++ Estructuras de control:for

Programación 1 Tema 3. Información, datos, operaciones y expresiones

Arboles Binarios de Búsqueda en C++

Operadores de comparación

VGOC"6<"Rtqitcocekôp"guvtwevwtcfc

TEMA 5: Subprogramas, programación modular

Tipos de Datos Simples Contenido del Tema

Lenguaje de Programación: C++ ARCHIVOS I/O

Programación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 2. Lenguaje de programación y ejecución de un programa

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

Examen escrito de Programación 1

PROGRAMACIÓN ORIENTADA A OBJETOS

Examen escrito de Programación 1

ESTRUCTURA DE DATOS: Tema 3. Recursividad

ESTRUCTURA DE DATOS: Tema 3. Recursividad

Unidad IV: Funciones

Estructuras Enlazadas AyED UTN-BA

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

Programación Orientada o Objetos

Transcripción:

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

2.1 Definición de Recursividad La Recursividad es una técnica de programación muy poderosa usada ampliamente para solucionar problemas. Se logra mediante la definición del problema en términos de una forma más simple, del problema mismo.

2.1 Definición de Recursividad Antepasado Definición Iterativa: Antepasado de una persona es su padre, abuelo, bisabuelo, tatarabuelo, tátara-tatarabuelo, y así sucesivamente (observe que aquí hay un ciclo implícito). Definición Recursiva: Antepasado de una persona es su padre o el antepasado de su padre.

2.1 Definición de Recursividad De acuerdo a lo anterior, un antepasado es: Padre. Antepasado de su padre. Por lo tanto: Padre. Padre de su padre. Padre del padre de su padre. Etc.

2.1 Definición de Recursividad Números Naturales Definición Iterativa: Los enteros entre cero e infinito. 0 1 2 3 4 5 6 7 8 9 10 11 12 Definición Recursiva: Son aquellos que son cero o el siguiente entero a un número natural.

2.1 Definición de Recursividad Factorial de n. Definición Iterativa: El producto de todos los enteros positivos menores o iguales a n. Para n=5, 5! = 1 x 2 x 3 x 4 x 5 Definición Recursiva: n multiplicado por el factorial del número natural anterior. El factorial de cero es 1. Para n=5, 5! = 5 * 4!

2.2 Procedimientos Recursivos. Los procedimientos recursivos deben contar con tres propiedades: 1.- Definición recursiva. El procedimiento que se define es utilizado en la propia definición. 2.- Al menos un Caso Base. Un escenario final que no usa recursividad para producir un resultado. 3.- Definición con reducción hacia el Caso Base. Un conjunto de reglas que reduce cualquier caso hacia el Caso Base.

2.2 Procedimientos Recursivos. #include <iostream> using namespace std; double factorial(char x); int main() { printf("el factorial de 0 es %.0f\n", factorial(0)); printf("el factorial de 5 es %.0f\n", factorial(5)); printf("el factorial de 7 es %.0f\n", factorial(7)); char n; printf("a que número deseas obtener el factorial? "); scanf("%d",&n); printf("el factorial de %d es %.0f\n", n, factorial(n)); system("pause"); return 0; double factorial(char x) { if (x==0) 2 return 1; else 1 3 return x*factorial(x-1);

2.2 Procedimientos Recursivos. Como ejercicio, reemplace la función factorial() por código iterativo y utilícela con la misma aplicación de la diapositiva anterior: double factorial(char x) { - - - - - - - - - - - - - - - - - - - - -

2.2 Procedimientos Recursivos. Serie de Fibonacci: Cualquier elemento de la serie es el valor que resulta de la suma de los dos elementos anteriores de la propia serie. Cero y uno son los primeros 2 elementos de la serie de Fibonacci. Posición Ordinal 1 2 3 4 5 6 7 8 9 10 11 12 Serie 0 1 1 2 3 5 8 13 21 34 55 89. 1.- Definición recursiva. Fibonacci 6 = Fibonacci 5 + Fibonacci 4 2.- Casos Base. Fibonacci 1 = 0; Fibonacci 2 = 1 3.- Reducción hacia el Caso Base. Fibonacci i = Fibonacci i-1 + Fibonacci i-2

2.2 Procedimientos Recursivos. #include <iostream> using namespace std; int fibo(int); int main() { int n; cout << "Elemento Ordinal de la serie de Fibonacci? 1->N ";cin >> n; cout << "Elemento: " << fibo(n) << endl; system("pause"); return 0; int fibo(int n) { 2 2 if ((n==1)or(n==2)) return n-1; else 1 3 3 return fibo(n-1)+fibo(n-2);

2.3 Ejemplos de Casos Recursivos. Los programas recursivos tienden a ser menos eficientes que los iterativos, pero ganan en claridad y simplicidad de código. Cuando se diseñan soluciones y se desea usar la recursividad, hay que cuidar ciertos casos como el de la serie de Fibonacci int fibo(int posicion) { if ((posicion==1)or(posicion==2)) return posicion-1; else return fibo(posicion-1)+fibo(posicion-2);

2.3 Ejemplos de Casos Recursivos. Este procedimiento cumple con las reglas para un procedimiento recursivo pero al llamarse en 2 ocasiones a ejecución, se vuelve sumamente ineficiente para tamaños de problema grandes int fibo(int posicion) { 2 2 if ((posicion==1)or(posicion==2)) return posicion-1; else 1 3 3 return fibo(posicion-1)+fibo(posicion-2);

2.3 Ejemplos de Casos Recursivos. La siguiente figura muestra cuantas veces se llama a ejecución la función fibo(6)

2.3 Ejemplos de Casos Recursivos. Añada al programa recursivo de Fibonacci el código resaltado #include <iostream> using namespace std; int fibo(int); int cuenta=0; int main() { int pos; cout << "Elemento Ordinal de la serie de Fibonacci? 1->N ";cin >> pos; cout << "Elemento: " << fibo(pos) << endl; cout << "Numero de Ejecuciones de fibo() " << cuenta << endl; system("pause"); return 0; int fibo(int posicion) { cuenta++; if ((posicion==1)or(posicion==2)) return posicion-1; else return fibo(posicion-1)+fibo(posicion-2);

2.3 Ejemplos de Casos Recursivos. La forma de recursividad usada para resolver Fibonacci es llamada Recursividad Múltiple porque cada llamada a la función causa más de una llamada adicional. Evite la Recursividad Múltiple ya que tiende a ser muy deficiente. Compruébelo calculando Fibonacci mayor a 20 por ejemplo. Ejecute los programas recursivo e iterativo para comprobarlo. La Recursividad Lineal no es tan deficiente como la múltiple, ya que se le llama de esa manera porque cada llamada solo causa una llamada más. Por ejemplo factorial().

2.3 Ejemplos de Casos Recursivos. Hay otra clasificación que es no es tan importante desde el punto de vista de ineficiencia. Directa (también llamada Simple). Es la que corresponde a nuestros ejemplos. Una función se llama a ejecución a sí misma. Indirecta (tambien llamada Compleja o Mutua). Una función se llama a ejecución a través de otra, en forma directa o indirecta. Es decir, A B A o A B C A causa una llamada más. Esta causa poca claridad en el código.

2.3 Ejemplos de Casos Recursivos. // Ejemplo Recursividad Indirecta #include <iostream> using namespace std; double factorial(char); double ReduccionCasoBase(char); int main(){ printf("el factorial de 0 es %.0f\n", factorial(0)); printf("el factorial de 5 es %.0f\n", factorial(5)); printf("el factorial de 7 es %.0f\n", factorial(7)); char n; printf("a que numero deseas obtener el factorial? "); scanf("%d",&n); printf("el factorial de %d es %.0f\n", n, factorial(n)); return 0; double factorial(char x){ if (x==0) return 1; else return ReduccionCasoBase(x); double ReduccionCasoBase(char y){ return y*factorial(y-1);

2.3 Ejemplos de Casos Recursivos. Hay que evitar el error de recursividad infinita pero no haga ninguna verificación en el programa recursivo. Asegúrese, en el programa de aplicación desde donde llama a la función, que los parámetros estén dentro de los límites previstos. En los ejemplos que hicimos debe impedirse ejecutar factorial(-1) por ejemplo. El uso de la Recursividad tiene a hacer más claro el código y la pérdida de eficiencia puede ser aceptable siempre y cuando no sea Múltiple.

2.3 Ejemplos de Casos Recursivos. // Como evitar la Recursividad Infinita #include <iostream> using namespace std; double factorial(char x); int main(){ char n; do{ printf("a que numero deseas obtener el factorial? "); scanf("%d",&n); while (n<0); printf("el factorial de %d es %.0f\n", n, factorial(n)); system("pause"); return 0; double factorial(char x){ if (x==0) return 1; else return x*factorial(x-1);

2.3 Ejemplos de Casos Recursivos. Orden de complejidad temporal de procedimientos recursivos. Ejemplo fibo() int fibo(int posicion) { if ((posicion==1)or(posicion==2)) return posicion-1; else return fibo(posicion-1)+fibo(posicion-2); El orden de complejidad temporal de la función es O(1), que se debe multiplicar por el número de veces que se ejecuta recurrentemente: 2 n aproximadamente, como lo vemos en la figura de abajo. Por lo tanto la complejidad de Fibonacci Recursivo es O(1) * 2 n O(k n )