Recursividad

30,840 views

Published on

conceptos, utilidades, tipos ...

Published in: Technology, Travel
7 Comments
12 Likes
Statistics
Notes
No Downloads
Views
Total views
30,840
On SlideShare
0
From Embeds
0
Number of Embeds
172
Actions
Shares
0
Downloads
743
Comments
7
Likes
12
Embeds 0
No embeds

No notes for slide

Recursividad

  1. 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. 2. <ul><ul><li>Es una Técnica que permite que una función se llame a si misma. </li></ul></ul><ul><ul><li>El concepto de Recursividad va ligado a la repetición. </li></ul></ul><ul><ul><li>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. </li></ul></ul>CONCEPTO
  3. 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. 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. 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. 6. <ul><ul><li>La sobrecarga asociada con las llamadas a subalgoritmos: </li></ul></ul><ul><ul><li>Este factor es propio de los subalgoritmos en general, aunque es mayor con la recursividad , ya que una simple llamada inicial a un subalgoritmo puede generar un gran número de llamadas recursivas . </li></ul></ul><ul><ul><li>Podemos fácilmente escribir una función iterativa Factorial tan clara como la recursiva y sin la sobre carga de ésta. </li></ul></ul>UTILIDAD DE LA RECURSIVIDAD
  7. 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. 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. 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. 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. 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. 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.
  13. 13. ALGORITMO TIPICO 1 2 3 A B C
  14. 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. 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. 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. 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. 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. 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
  20. 20. IMPLEMENTACIÓN ALGORITMOS RECURSIVOS RECURSIVO A SCENDEN T E DE SCENDEN T E REGRESIVO PROGRESIVO
  21. 21. IMPLEMENTACIÓN ALGORITMOS RECURSIVOS GRANDE PEQUEÑO
  22. 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. 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 =
  24. 24. Gracias

×