Avances tecnológicos del siglo XXI y ejemplos de estos
Recursividad
1. EQUIPO Nº 4 RECURSIVIDAD ALVARADO ROSA NELFALY MEDINA BETZY RODRIGUEZ VASQUEZ ALBA RIVAS MIRIAM RIOS LUIS Prof. Ing. Zamantha González. PNFSI. Cojedes.
2.
3. CONCEPTO Para que una función recursiva sea válida, la referencia a sí misma debe ser relativamente más sencilla que el caso considerado. En un algoritmo recursivo distinguimos como mínimo 2 partes: a). Caso trivial, base o fin de recursión: Es un caso donde el problema puede resolverse sin tener que hacer uso de una nueva llamada a sí mismo. Evita la continuación indefinida de las partes recursivas. b). Parte puramente recursiva: Relaciona el resultado del algoritmo con resultados de casos mas simples. Se hacen nuevas llamadas a la función, pero están más próximas al caso base.
4. CONCEPTO Ejemplos: ITERATIVO: Int Factorial (int n ) { Int ¡, res = 1; For(¡=1;¡<=n;¡++ ) res = res*¡; return (res); } RECURSIVO: Int Factorial (int n ) { If (n==0) return (1); Return (n*Factorial (n-1)); }
5. UTILIDAD DE LA RECURSIVIDAD Se utiliza para realizar una llamada a una función desde la misma función. Hemos visto que la recursión es una técnica potente de programación para resolver, mediante soluciones simples y claras, problemas de gran complejidad.
6.
7. UTILIDAD DE LA RECURSIVIDAD Ej: de Factorial en algoritmo: N es 0 FACTORIAL 1 Retorno FACT FACTORIAL (3) N es 3 FACTORIAL 3* FACTORIAL (2) Retorno N es 2 FACTORIAL 2* FACTORIAL (1) Retorno N es 1 FACTORIAL 1* FACTORIAL (0) Retorno
8. TIPOS DE RECURSIVIDAD Recursividad Simple: Aquella en cuya definición sólo aparece una llamada recursiva. Se puede transformar con facilidad en algoritmos iterativos. Recursividad Múltiple: Se da cuando hay más de una llamada a sí misma dentro del cuerpo de la función, resultando más difícil de hacer de forma iterativa. int Fib( int n ) /* ej: Fibonacci */ { if(n<=1) return(1); return(Fib(n-1) + Fib(n-2)); }
9. TIPOS DE RECURSIVIDAD Recursividad Anidada: En algunos de los argumentos de la llamada recursiva hay una nueva llamada a sí misma. int Ack( int n, int m ) /* ej: Ackerman */ { if(n==0 ) return(m+1); else if(m==0) return(Ack(n-1,1)); return(Ack(n-1, Ack(n,m-1))); }
10. TIPOS DE RECURSIVIDAD Recursividad cruzada o indirecta: Son algoritmos donde una función provoca una llamada a sí misma de forma indirecta, a través de otras funciones. Ej: Par o Impar: int par( int nump ) { if(nump==0) return(1); return( impar(nump-1)); } int impar( int numi ) { if(numi==0) return(0); return( par(numi-1)); }
11. ALGORITMO: DIVIDE Y VENCERAS Una de las técnicas más importantes para el diseño de algoritmos típicos en la Recursividad es la técnica llamada:”Divide y Vencerás”. Esta técnica consiste en transformar un problema de tamaño n en problemas más pequeños, de tamaño menor que n. El algoritmo de búsqueda binario es un ejemplo típico de esta técnica algorítmica. La lista ordenada de los elementos se divide en dos mitades de forma de que el problema de búsqueda de un elemento se reduce al problema de búsqueda en una mitad; así se prosigue dividiendo el problema hasta encontrar el elemento, o bien decir que no se encuentra. Un algoritmo “Divide y Vencerás”, puede ser definido de manera recursiva, de tal modo que se llama así mismo aplicándose cada vez a un conjunto menor de elementos. ALGORITMO TIPICO
12. ALGORITMO TIPICO TORRE DE HANOI: Problema de solución recursiva, consiste en mover todos los discos (de diferentes tamaños) de una aguja a otra, Usando una aguja auxiliar, y sabiendo que un disco no puede estar sobre otro menor que éste.
14. ALGORITMO TIPICO /* Solución : 1- Mover n-1 discos de A a B 2- Mover 1 discos de A a C 3- Mover n-1 discos de B a C */ Void Hanoi(n,inicial,aux,final) { if( n>0) { Hanoi (n-1,inicial,final,aux); printf (“Mover % d de % c”, n,inicial,final); Hanoi (aux, inicial,final); } }
15. ALGORITMO TIPICO Ordenación por inserción Se trata de ordenar un vector formado por n enteros. Para esto el algoritmo de inserción va intercambiando elementos del array hasta que esté ordenado.
16. ALGORITMO TIPICO void insercion (int a[]) { int i, j, x; for (i=1; i x = a[i]; j = i - 1; while ((j>-1) && (a[j]>x)) { a[j+1] = a[j]; j = j - 1; } a[j+1] = x; } }
17. ALGORITMO TIPICO Ordenación por selección Se trata de ordenar un vector formado por n enteros. Para esto el algoritmo de selección va seleccionando los elementos menores al actual y los intercambia.
18. ALGORITMO TIPICO void seleccion (int a[]) { int i, j; int minx, minj; for (i=0; i < n-1; i++) { minj = i; minx = a[i]; for (j = i; j < n; j++) { if (a[j] < minx) { minj = j; minx = a[j]; } } a[minj] = a[i]; a[i] = minx; } }
19. Satisface dos interrogantes 1.- ¿Cómo se resuelve el caso mas pequeño del problema? 2.- ¿Cómo se resuelve el caso general del problema, sabiendo que tiene el caso anterior mas pequeño? IMPLEMENTACIÓN ALGORITMOS RECURSIVOS
22. IMPLEMENTACIÓN ALGORITMOS RECURSIVOS • Ejercicio: Escribir una función recursiva que calcule la división entera entre dos números: int DivisionEntera(int a, int b, int &resto) { int cociente; if ( a < b) { resto = a; cociente = 0; } else { a= a - b; cociente = cociente + 1; cociente = DivisionEntera(a, b, resto); } return cociente; }
23. IMPLEMENTACIÓN ALGORITMOS RECURSIVOS a < b 10<5 F a < b 5<5 F a = 5-5 a=0 Cociente 1+1=2 a < b 0<5 V 2 0 5 0 1 Ø 5 5 1 Ø 5 10 Cociente Rest. B A 5 10 2 =