Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porAlejandro David Belmonte Espinoza Modificado hace 6 años
1
Programación Orientada a Objetos
Unidad III – Conceptos Avanzados de Programación Programación Orientada a Objetos Programación I
2
Programación Orientada a Objetos Contenido
Esta lección abarca los siguientes temas con respecto a Recursividad: ¿Qué es recursividad? Utilidad de la recursividad Formas de recursividad Casos base Funcionamiento de un algoritmo recursivo Ejemplos de algoritmos recursivos Notas importantes Recursividad Vs Iteratividad ¿Por qué escribir programas recursivos? ¿Cuándo usar/no usar recursividad? Ejemplos clásicos Ejercicios
3
Programación Orientada a Objetos Recursividad
¿Qué es Recursividad? El concepto de recursividad va ligado al de repetición. Son recursivos aquellos Algoritmos que, estando encapsulados dentro de una método, son llamados desde él mismo, una y otra vez, en contraposición a los algoritmos iterativos, que hacen uso de bucles while, do-while, for, etc. Algo es recursivo, si se define en términos de sí mismo (cuando para definirse hace mención a sí mismo). Para que una definición recursiva sea válida, la referencia a sí misma debe ser relativamente más sencilla que el caso considerado.
4
Programación Orientada a Objetos Recursividad
Utilidad de la Recursividad Cuando la solución de un problema se puede expresar en términos de la resolución de problemas de la misma naturaleza, aunque de menor complejidad.
5
Programación Orientada a Objetos Recursividad
Formas de Recursividad La recursividad en los subprogramas puede darse de dos maneras diferentes: a) Directa El subprograma se llama directamente a sí mismo. b) Indirecta El subprograma llama a otro subprograma, y éste a su vez llama al primero.
6
Programación Orientada a Objetos Recursividad
Basada en el criterio: Divide y Vencerás Un problema complejo, se divide en uno más sencillo. Solo se debe conocer la solución no recursiva para algún caso sencillo (denominado caso base) y hacer que la división del problema termine recurriendo a los casos bases que se hayan definido. Se puede considerar que se “tiene resuelto” el problema mas complejo (sin tener que definir la secuencia exacta de pasos necesarios para resolver el problema)
7
Programación Orientada a Objetos Recursividad
Sintaxis de una función ó método recursivo Se debe recordar que siempre que se completa la llamada a un método o subprograma, el control regresa al punto en el cual el subprograma fue llamado. Se aplica la misma regla a las llamadas recursivas. Una función ó método recursivo debe tener: La llamada recursiva. Condición de parada ó de terminación.
8
Programación Orientada a Objetos Recursividad
Sintaxis de una función ó método recursivo Las funciones ó métodos recursivos se componen de: Caso base: una solución simple para un caso particular (puede haber más de un caso base). Caso recursivo: una solución que involucra volver a utilizar la función original, con parámetros que se acercan más al caso base. Los pasos que sigue el caso recursivo son los siguientes: El procedimiento se llama a sí mismo. El problema se resuelve, resolviendo el mismo problema pero de tamaño menor. La manera en la cual el tamaño del problema disminuye asegura que el caso base eventualmente se alcanzará.
9
Programación Orientada a Objetos Recursividad
Casos Base En toda definición recursiva de un problema, se debe establecer un estado básico, es decir un estado en el cual la solución no se presente de manera recursiva sino directamente. Además, la entrada (datos) del problema debe ir acercándose al estado básico. Es decir, para que las llamadas recursivas no continúen indefinidamente, el cuerpo de un subprograma recursivo debe incluir por lo menos un caso terminal, es decir, un caso que no contiene más llamadas al subprograma.
10
Programación Orientada a Objetos Recursividad
Ejemplo de una función o método recursivo int potencia (int b, int n) { if(n==0) return 1; else return ( b* potencia(b,n-1) ); } potencia(b,n) = si n=0 b * potencia(b,n-1) si n>0
11
Programación Orientada a Objetos Recursividad
Ejemplo de una función o método recursivo return 1 return 5*Potencia(0) return 5*Potencia(1) return 5*Potencia(2)
12
Programación Orientada a Objetos Recursividad
Funcionamiento de un algoritmo recursivo Se descompone el problema en problemas de menor complejidad (de la misma naturaleza que el problema inicial) Se resuelve el problema para, al menos, un caso base. Se compone la solución final a partir de las soluciones parciales que se han obtenido.
13
Programación Orientada a Objetos Recursividad
Ejemplo de una función o método recursivo Escribe un programa que calcule el factorial (!) de un entero no negativo. A continuación, algunos ejemplos de factoriales: 0! = 1 1! = 1 2! = 2 2! = 2 * 1! 3! = 6 3! = 3 * 2! 4! = 24 4! = 4 * 3! 5! = 120 5! = 5 * 4!
14
Programación Orientada a Objetos Recursividad
Ejemplo de una función o método recursivo A continuación se puede ver la secuencia de factoriales. 0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 ... N! = = 1 * 1 = 1 * 0! = 2 * 1 = 2 * 1! = 3 * 2 = 3 * 2! = 4 * 6 = 4 * 3! = 5 * 24 = 5 * 4! = N * (N – 1)!
15
Programación Orientada a Objetos Recursividad
Ejemplo de una función o método recursivo Aquí podemos ver la secuencia que toma el factorial Un razonamiento recursivo tiene dos partes: la base y la regla recursiva de construcción. La base no es recursiva y es el punto tanto de partida como de terminación de la definición. si N = 0 (Base) N ! = N * (N – 1) ! si N > 0 (Recursión)
16
Programación Orientada a Objetos Recursividad
Ejemplo de una función o método recursivo int factorial (int n) { int resultado; if(n==0) resultado = 1; else resultado = n * factorial(n-1); return resultado; } factorial(n)= si n=0 n * factorial(n-1) si n>0
17
Programación Orientada a Objetos Recursividad
Ejemplo de una función o método recursivo
18
Programación Orientada a Objetos Recursividad
Ejemplo de una función ó método recursivo
19
Programación Orientada a Objetos Recursividad
Notas importantes sobre Recursividad Siempre se debe avanzar hacia un caso base. Las llamadas recursivas simplifican el problema, y en última instancia los casos bases nos ayudan a encontrar la solución. Los casos bases corresponden a situaciones que se pueden resolver con facilidad. Los demás casos se resuelven recurriendo, antes o después a alguno (s) de los casos bases.
20
Programación Orientada a Objetos Recursividad
Recursividad Vs Iteratividad Aspectos que hay que considerar al momento de decidir como se va a implementar la solución de un problema: La Carga Computacional: Tiempo de CPU y llamadas a memoria asociadas a las llamadas recursivas. La Redundancia: Algunas soluciones recursivas resuelven el mismo problema en repetidas ocasiones. La Complejidad de la Solución: En ocasiones las soluciones iterativas son más difíciles de encontrar. La Legibilidad y la Elegancia del Código: La solución recursiva puede ser más sencilla.
21
Programación Orientada a Objetos Recursividad
¿Por qué escribir programas recursivos? Son mas cercanos a la descripción matemática. Generalmente mas fáciles de analizar. Se adaptan mejor a las estructuras de datos recursivas. Los algoritmos recursivos ofrecen soluciones estructuradas, modulares y elegantemente simples.
22
Programación Orientada a Objetos Recursividad
¿Cuándo usar Recursividad? Para simplificar el código. Cuando la estructura de datos es recursiva ejemplo : árboles. ¿Cuándo No usar Recursividad? Cuando el método cambia de manera impredecible de datos. Cuando las iteraciones sean la mejor opción.
23
Programación Orientada a Objetos Recursividad
Ejemplo de una función o método recursivo Realizar un algoritmo recursivo para determinar la suma de los n primeros números naturales. Solución Iterativa int suma_natural (int n){ int acum=0; for(int i=1; i<=n; i++) { acum=acum+i; } return acum; Solución Recursiva int suma_natural (int n){ if(n==1) return 1; else return n+suma_natural(n-1); }
24
Programación Orientada a Objetos Recursividad
Ejemplo de una función o método recursivo Dado un vector de enteros de n posiciones, que se encuentra totalmente pre-cargado, encontrar una solución recursiva que permita obtener el elemento mayor de dicho vector. int mayor (int * vec){ int i, may=0; for(i=0;i<MAX;i++) { if (vec[i]>may) may = vec[i]; } return may; Solución Iterativa
25
Programación Orientada a Objetos Recursividad
Solución Recursiva Mayor(V, n) = V [0] si n = 0 V [n] ó Mayor(V, n-1) si n > 0 void main(){ int vector[]={8,3,9,1}; printf(“El Mayor es: %d”, mayor(vector,3) ); getch(); } int mayor (int vec[], int n){ int aux; if(n==0) return vec[0]; else { aux = mayor(vec, n-1); if(vec[n]>aux) return vec[n]; return aux; }
26
Programación Orientada a Objetos Recursividad
Solución Recursiva int mayor (int vec[], int n){ int aux; if(n==0) return vec[0]; else { aux = mayor(vec, n-1); if(vec[n]>aux) return vec[n]; return aux; } mayor(vector,0) {8,3,9,1} 0 mayor(vector,1) {8,3,9,1} 1 mayor(vector,2) {8,3,9,1} 2 mayor(vector,3) {8,3,9,1} 3 LLAMADAS vec n return 8 aux=8 if (vec[1]>aux) 3>8 return 8 aux=8 if (vec[2]>aux) 9>8 return 9 aux=9 if (vec[3]>aux) 1>9 return 9 aux=9 RETORNOS
27
Programación Orientada a Objetos Recursividad
Ejemplos clásicos Existen muchos ejemplos clásicos de algoritmos recursivos, algunos de los más populares son: 8 Reinas Torres de Hanoi Cuadrado mágico Salto del caballo
28
Programación Orientada a Objetos Recursividad
Ejemplos clásicos Las 8 Reinas Ubicar 8 reinas en un tablero de ajedrez sin que se amenacen entre ellas.
29
Programación Orientada a Objetos Recursividad
Ejemplos clásicos Torres de Hanoi A B C
30
Programación Orientada a Objetos Recursividad
Ejemplos clásicos Cuadrado Mágico Solución de EULER, Cuadrado Mágico, filas y columnas suman 260
31
Programación Orientada a Objetos Recursividad
Ejemplos clásicos Salto del Caballo Intentar pasar el caballo por todas las casillas del tablero, sin pasar dos veces por una misma casilla
32
Programación Orientada a Objetos Recursividad
Ejercicios Ejercicio 1: Programa una función recursiva que Dado una palabra revisar cuántas veces aparece determinada letra. Ejercicio 2: Programa una función recursiva que calcule la suma de un vector de números enteros. Ejercicio 3: Programa una función recursiva que invierta el orden de un vector de números enteros.
33
Programación Orientada a Objetos Recursividad
Ejercicios Ejercicio 1: Programa una función recursiva que Dado una palabra revisar cuántas veces aparece determinada letra. #include <stdio.h> #include <conio.h> #include <string.h> int enc(char *,int,int); void main(){ char cadena[11]="universidad"; char letra='d'; int aux=-1; clrscr(); if((aux=enc(cadena,strlen(cadena),(int)letra))!=-1) printf(“Numero de veces encontrada %d",aux); else printf("\nLetra no encontrada"); getch(); } int enc(char *v,int n,int elem){ int aux=0; if(n==0) return 0; else{ aux=enc(v,n-1,elem); if(v[n]==elem) return ++aux; return aux; }
Presentaciones similares
© 2024 SlidePlayer.es Inc.
All rights reserved.