1 / 29

Funciones. Recursividad

Funciones. Recursividad. Ejemplo 1: La función factorial, n! (para enteros no negativos) Ejemplo 2 : La definición de números naturales: 1) 1 es un número natural 2) Todo sucesor de un número natural es otro número natural. Recursividad:.

ember
Télécharger la présentation

Funciones. Recursividad

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Funciones. Recursividad

  2. Ejemplo 1: La función factorial, n! (para enteros no negativos) Ejemplo 2: La definición de números naturales: 1) 1 es un número natural2) Todo sucesor de un número natural es otro número natural

  3. Recursividad: Se dice que un objeto o proceso es recursivo, si en parte está formado por sí mismo o se define en función de si mismo Ejemplo 3: Un descendiente del Sr. Perez. Es ó un hijo del Sr. Perez (1) ó un hijo de un descendiente del Sr. Perez (2)

  4. Imagen Recursiva

  5. Ejemplo 4: Potencia entera N (N>=0) de un número real X no nulo Ejemplo 5: El producto de dos números enteros positivos A y B

  6. Varios subproblemas que se han pensado anteriormente como iterativos se pueden analizar desde el punto de vista de la recursividad.- • A continuación nos limitaremos a tratar la recursión como herramienta de programación Un subprograma que se llama a sí mismo se dice que es recursivo

  7. Tipos de Recursión: Subprograma P ------------- ------------- Llamada a P ------------ Recursión Directa A) Directa: el sub-programa se llama directamente a sí mismo. La recursión en los subprogramas puede darse de dos maneras diferentes:

  8. B) Indirecta: el subprograma llama a otro subprograma, y éste a su vez llama al primero. También se da el caso de recursión indirecta cuando un subprograma llama a otro y éste a un tercero que a su vez llama al primer subprograma Subprograma P Subprograma Q ----------------- -------------------- ----------------- Llamada a P Llamada a Q -------------------- -----------------

  9. Ejemplos de recursividad indirecta:Ejemplo 1: Origen Diccionario de Lengua Española ITER Duplex - SopenaMUCHEDUMBRE: f. MultitudMULTITUD: f. MuchedumbreEjemplo 2:“La vida es una muerte que viene. La muerte es una vida vivida”Jorge Luis Borges

  10. Características: • Una recursión es correcta cuando cumple con las condiciones siguientes: 1) Contiene una condición que evite continuar la recursión cuando se haya alcanzado el estado final 2) Se llega si o si al estado final 3) Cuando se llega al estado final se debe haber completado el cálculo correcto

  11. La primer característica es sumamente importante, las definiciones recursivas correctas tienen siempre una condición de salida llamada “caso base”, de resolución directa y generalmente muy simple.-Los ejemplos mencionados en recursividad indirecta no presentan la condición de salida. Por lo tanto los podemos tomar también como ejemplos de definiciones recursivas incorrectas.-

  12. Ejemplo: El algoritmo de Euclides para cálcular el máximo común divisor (MCD) se define de la manera siguiente:M si N = 0 “Caso Base” MCD( M, N ) MCD( N, M % N ) si N>0Presenta la condición de salida cuando N es cero

  13. A continuación presentamos la definición de la función Factorial que en clases anteriores hemos resuelto utilizando iteraciones int iFact ( int iN ){ if ( iN = = 0 ) return 1 ; /* Salida de la definición */ else return iN * iFact ( iN - 1); /*Parte recursiva propiamente dicha*/ }

  14. La definición de funciones recursivas es similar a las funciones que hemos utilizado anteriormente. La única diferencia es que en su definición se utiliza la misma función que todavía no ha terminado de definirse • El acceso de la función no presenta diferencias la función recursiva se puede llamar desde cualquier expresión o desde cualquier lugar donde se acepte una instrucción

  15. Como funciona internamente la recursión: • Cuando se ejecuta una función recursiva, salvo cuando se ejecute el “caso base”, la misma se activara nuevamente. Con cada llamada recursiva se crea una copia de todas las variables y constantes que estén vigentes, además se guarda una referencia a la siguiente instrucción a ejecutar. Esto continua así hasta que se ejecute condición de salida La Recursión ocupa generalmente recursos y tiempo

  16. Recursión o iteración: • Hemos visto que la función Factorial se la pudo implementar de dos maneras distintas, una utilizando una estructura iterativa y la otra llamandose a si misma. Esto sucede en todas las funciones que resuelven un subproblema ejecutando un mismo conjunto de acciones varias veces.-

  17. Por ejemplo el polinomio de Mc Laurin de grado n asociado a la función exponencial es el siguiente: También se lo puede definir de la en forma recursiva como: 1 si n = 0; P(x , n) = P(x, n-1) + xn/n! si n > 0

  18. Los algoritmos recursivos son particularmente apropiados cuando el problema a resolver (o los datos a tratar) se definen en forma recursiva. Las soluciones recursivas en general son más simples y ofrecen soluciones sencillas a problemas complejos.-Como contrapartida ya mencionamos que en general es mas ineficiente que las soluciones iterativas.-

  19. Dentro de las soluciones recursivas se encuentra un caso cuya ineficiencia se magnifica es aquel en el cual un subprograma se llama a si mismo dos o más veces.- Subprograma P------------------ Llamada a P ------------------ Llamada a P ------------------ ------------------

  20. Ejemplo: Busqueda Binaria El ejemplo esta destinado a una de las operaciones más importantes en el procesamiento de información: la busqueda. La operación de búsqueda permite recuperar la datos previamente almacenados. El resultado que puede arrojar esta operación es éxito, si se encuentra el elemento buscado, o fracaso, en otra circunstancia

  21. La búsqueda binaria precedió a las computadoras. En esencia, es el algoritmo que se emplea para buscar una palabra en un diccionario, o un nombre en un directorio.- • Análisis:Datos: Vector ordenado por orden creciente Elemento a buscarIncógnita: Si el elemento se encuentra su posición dentro del vector

  22. El procedimiento de búsqueda consiste en lo siguiente: Se ubica el dato que esta almacenado en el “centro” del vector y se lo compara con el elemento a encontrar, si coinciden la búsqueda concluye con éxito, en caso contrario se vuelve a repetir el proceso pero ahora concentrandonos o en el subvector izquierdo o en el subvector derecho según el elemento sea menor o mayor respectivamente que el dato “central”del vector

  23. El procedimiento se repite hasta que o se encuentra el elemento o el subvector donde se debe buscar no tenga más elementos. Para poder saber donde continuar buscando nos auxiliaremos con dos variables que llevarán el indice inferior y el indice superior del subvector de busqueda • 0 1 2 3 4 5 6 7 8 9 10-5 -2 0 3 8 8 9 12 12 26 31 iX= iVect[k] i k d no i k d siBusqueda binaria de iX = 12

  24. 0 1 2 3 4 5 6 7 8 9 10-5 -2 0 3 8 8 9 12 12 26 31 iX= iVect[k] i k d no i k d no i,k d no idk no d i Oh!Busqueda binaria de iX = 11

  25. #include <stdio.h> #include <conio.h> #include "datos.h" /*Declaracion de variables*/ int iVect[15] = datos1; int iX; int iY;

  26. int iBin (int iV[15],int iElem, int iIzq, int iDer) { int iAux; if (iIzq <= iDer){ iAux = (iIzq + iDer)/2; if (iElem == iV[iAux]) return (iAux); /*Elemento Encontrado*/ else {if (iElem > iV[iAux]) iIzq = iAux + 1; else iDer = iAux - 1; iBin (iV, iElem, iIzq, iDer); } } else return (-1); /*Elemento No Encontrado*/ }

  27. main(){ clrscr(); scanf("%d",&iX); iY = iBin (iVect , iX , 0 , 14 ); if ( iY >-1 ) printf("Elemento encontrado en la posicion: %d",iY+1); else printf("Elemento NO encontrado"); getche( );}

  28. /* Contenido del Archivo “Datos.h”*/ #define datos1 {-5, -3, 0, 2, 3, 5, 10, 15, 45, 78, 79, 81, 89, 100, 122} Análisis de la búsqueda binaria: Para analizar la complejidad de la este método tomaremos los casos más favorables y los menos favorables. El primer caso se da cuando el elemento buscado es el central, en dicho caso se hará una sola comparación; el segundo caso sucede cuando el elemento no se encuentra en el arreglo, en dicho caso se harán aproximadamente log2(n) comparaciones (donde: n es el número de elementos del arreglo)

  29. Cmín = 1 Cmáx = log2(n) n Cmín Cmed Cmáx 10 1 2.5 4 100 1 4 7 1000 1 5.5 1010000 1 7.5 14 Bibliografía Recomendada:Como Programar en C/C++ H.M. Deitel / P. J. Deitel Ed. Prentice Hall

More Related