Conceptos Avanzados de Programación Presentación C y C++ Conceptos Avanzados de Programación :: Prof. Yeniffer Peña
Unidad I: Conceptos Avanzados de Programación Recursividad: El concepto de recursividad va ligado al de repetición. Son recursivos aquellos algoritmos que, estando encapsulados dentro de una función, son llamados desde ella misma 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.
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. 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.
Recursividad Basada en el Criterio: Divide y Vencerás Un problema complejo se divide en uno mas 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)
Sintaxis de una Función Recursiva: Recursividad Sintaxis de una Función Recursiva: Se debe recordar que siempre que se completa la llamada a una función, el control regresa al punto en el cual ésta fue invocada. Se aplica la misma regla a las llamadas recursivas. Una función recursiva debe tener: - La llamada recursiva. - Condición de parada ó de terminación.
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.
Ejemplo de una función recursiva: Recursividad Ejemplo de una función recursiva: int potencia (int x, int n) { if(n==0) return 1; else return x * potencia(x,n-1); } potencia(b,n)= 1 si n=0 b * potencia(b,n-1) si n>0
Ejemplo de una función recursiva: Recursividad Ejemplo de una función recursiva: return 1 return 5*Potencia(0) return 5*Potencia(1) return 5*Potencia(2)
Funcionamiento de un Algoritmo Recursivo: 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
Otro Ejemplo de Función Recursiva: Recursividad Otro Ejemplo de Función Recursiva: int factorial (int n) { if(n==0) return 1; else return (n * factorial(n-1)); } factorial(n)= 1 si n=0 n * factorial(n-1) si n>0
Recursividad Otro Ejemplo de Función Recursiva:
Recursividad Otro Ejemplo de Función Recursiva:
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.
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.
Ejemplo de Aplicación de la Recursividad: 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
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; }
Recursividad 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; } 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
Ejemplo de Aplicación de la Recursividad: Dado una palabra revisar cuántas veces aparece determinada letra. 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; } Solución recursiva #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(); }
Operaciones y Manejo de Bits Conceptos Avanzados de Programación C y C++ Conceptos Avanzados de Programación Continuará . . .