1 / 17

Programación Científica

Programación Científica. Dr. Romeo S ánchez Nigenda . E-mail: romeo.sanchez @ gmail.com http: //yalma.fime.uanl.mx/~ romeo / Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10am-11am Martes y Jueves Website: http://yalma.fime.uanl.mx /~ romeo/Prog/

Download Presentation

Programación Científica

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. Programación Científica Dr. Romeo SánchezNigenda. E-mail: romeo.sanchez@gmail.com http://yalma.fime.uanl.mx/~romeo/ Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10am-11am Martes y Jueves Website: http://yalma.fime.uanl.mx/~romeo/Prog/ Sesiones: 48 * Slides aumentados con información de Dr. Roger Ríos, y Dr. Fernando López

  2. 40% Proyecto 30% Examen Parcial 30% Examen Final 10% Participación Temario: • Fundamentos de Programación en C • Apuntadores y Funciones • Arreglos y Estructuras • Manejo de Memoria • Recursividad • Entrada y Salida de Archivos • Desarrollo y Depuración de Proyecto de Programación Total a calificar: 110 puntos!

  3. Material de apoyo: A. KELLY, I. POHL. A Book on C. Addison-Wesley, Reading, EUA, 1998. 2. B. KERNIGHAN, D. RITCHIE. The C Programming Language. Prentice Hall, Second Edition, 1988. 3. D. KNUTH. The Art of Computer Programming. Addison Wesley, 1998. 4. H. DEITEL, P. DEITEL. Como Programar en C/C++. Prentice Hall, Segunda Edición. 1995. 5. L. Joyanes, I. Zahonero. Programación en C - Metodología, Algoritmos y Estructura de Datos. McGraw Hill-Interamericana, 2006. 6. B. Stroustrup. The C++ Programming Language. Addison Wesley. Third Edition. 1997. Software: Compiladores GCC (GNU CompilerCollection) IDEs (IntegratedDevelopmentEnvironment): http://www.eclipse.org/downloads/ http://kdevelop.org/ http://www.bloodshed.net/devcpp.html

  4. Recursión • Objetivo: El alumno comprenderá la representación y manejo de datos en forma recursiva • Temario: • Definición • Ejemplos • Factorial de un número • Serie de Fibonacci • Cálculo de una inversión • Funcionamiento interno de la recursión • Uso de pilas para simular recursión

  5. Recursividad • Es la forma en la cual se especifica un proceso basado en su propia definición. Es evidente que el proceso especificado debe terminar con un resultado definido. • Un problema que pueda ser definido en función de su tamaño, sea este N, puede ser dividido en instancias más pequeñas del mismo problema, aplicándose inducción sobre las más pequeñas para resolver el problema en general. • Ejemplo: Función Factorial n! • Dado un entero positivo n, se define al factorialde ncomo el producto de todos los enteros entre n y 1. • Por ejemplo el factorial de 5 = 5 * 4 * 3 * 2 * 1 = 120 • Entonces: n! = 1 if n==0 Otra manera n! = n * (n – 1) * (n – 2) … * 1 si n>0

  6. Factorial • Solución iterativa: prod= 1 for(int x = n; x > 0; x++) { prod *= x; } return prod; • Características de una función factorial 0! = 1 1! = 1 * 0! 2! = 2 * 1! 3! = 3 * 2! … n! = n * (n-1)!

  7. Factorial y FuncionamientoInterno Internamente, las funciones recursivas utilizan pilas para mantener las generaciones sucesivas de variables locales y parámetros. • Siguiendo nuestra definición, el factorial de 5! es: • 5! = 5 * 4! • 4! = 4 * 3! • 3! = 3 * 2! • 2! = 2 * 1! • 1! = 1 * 0! • 0! = 1 • 0! = 1, • 1! = 1 * 1 = 1 • 2! = 2 * 1 = 2 • 3! = 3 * 2 = 6 • 4! = 4 * 6 = 24 • 5! = 5 * 24 = 120 Cualquier referencia a una variable local se hace través del tope de la pila Cada vez que se introduce una función recursiva se agrega al tope de la pila una nueva asignación de sus variables. old Cuando retorna la función, se remueve la pila, se libera la asignación en el tope, y la asignación previa se convierte en el tope actual de la pila. new

  8. Factorial • Función Recursiva int factorial(int n) { if (n == 0) return 1; else if(n<0) return 0; //Error no existe factorial de números negativos return n * factorial(n – 1); } • Multiplicación de Números Naturales • El producto a * b se define comoasumado a sí mismo b veces, es decir: a * b = a if b==1 a * b = a * (b – 1) + a ifa>1 5 * 3 = 5 * 2 + 5 = 5 * 1 + 5 + 5 = 5 + 5 + 5 = 15 int natural(int a, int b){ if(b == 1) return a; else return natural(a, b-1) + a; }

  9. Secuencia Fibonacci • Secuencia de enteros en la que cada elemento en la secuencia es la suma de los dos elementos anteriores 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, … donde fib(0) = 0, y fib(1) = 1 • Definición recursiva Fib(n) = n if n==0 || n==1 Fib(n) = Fib(n-2) + Fib(n-1) if (n>=2) Ejemplo: Fib(6) = Fib(4) + Fib(5) = Fib(2) + Fib(3) + Fib(5) = Fib(0) + Fib(1) + Fib(3) + Fib(5) = 0 + 1 + Fib(3) + Fib(5) = 1 + Fib(1) + Fib(2) + Fib(5) = 1 + 1 + Fib(0) + Fib(1) + Fib(5) = 1 + 1 + 0 + 1 + Fib(5) = 3 + Fib(5) = 3 + Fib(3) + Fib(4) = 3 + Fib(1) + Fib(2) + Fib(4) = 3 + 1 + Fib(0) + Fib(1) + Fib(4) = 4 + 0 + 1 + Fib(4) = 5 + Fib(2) + Fib(3) = 5 + Fib(0) + Fib(1) + Fib(3) = 5 + 1 + Fib(3) = 6 + Fib(1) + Fib(2) = 6 + 1 + Fib(2) = 7 + Fib(0) + Fib(1) = 8

  10. Secuencia Fibonacci • Algoritmoiterativo intlfib=0, hfib=1, x; for(inti=2;i<=n;i++){ x = lfib; lfib = hfib; hfib = x+lfib; } return hfib; • AlgoritmoRecursivo intfibonacci(int n){ if (n == 0 || n == 1) { return n; } return fibonacciR(n - 1) + fibonacciR(n - 2); }

  11. Búsqueda Binaria • Considere un conjunto de elementos ordenados • La búsqueda secuencial checaría elemento por elemento 32? La búsqueda binaria reduce los elementos a buscar por la mitad al considerar la primera mitad del arreglo si el elemento a buscar es menor que el elemento intermedio, o la segunda mitad si es mayor 0 intermedio N-1 min max > < 32? A considerar

  12. Búsqueda Binaria 0 N-1 intermedio intermedio (Min+max) /2 min max 4 > < 32? A considerar 7 Descartados! min max < > 32? A considerar 5 min max > 32?

  13. Búsqueda Binaria int busqueda_binaria(int a[], int min, int max, int elem){ //No encontramos el elemento cuando los dos extremos se cruzan if(min>max) return -1; //Index intermedio intpivote = (int)(min+max)/2; //Regresa el intermedio si es igual que el elemento que busco if(elem == a[pivote]) return pivote; if(elem < a[pivote]) return busqueda_binaria(a,min, pivote-1, elem); else return busqueda_binaria(a,pivote+1, max, elem); }

  14. Propiedades de un algoritmo recursivo • Para que sea correcto no debe generar una secuencia infinita. Debe definirse una función recursiva f en términos que no implique f para algunas secuencias • Ejemplos: • Factorial: 0! =1 • Fibonacci: fib(0) = 0, fib(1) = 1 • Búsqueda Binaria: if(min>max) return -1; if(elem==a[pivote]) return pivote; • Definir una función recursiva en términos de casos más simples. Por ejemplo, el factorial de un número n! puede definirse como n * (n-1)!

  15. Simulación de recursión usando pilas Motivación: • Algunos lenguajes de programación (como Fortran y Cobol) no permiten funciones recursivas. • En muchos casos, una solución recursiva es más costosa que una no recursiva, tanto en términos de tiempo como de espacio.

  16. Simulación de recursión usando pilas • Qué sucede cuando se llama a una función? • Se pasan argumentos • Asignan e inicializan variables locales • Establecer el control de la función (dirección de retorno) • Que sucede cuando retorna una función? • Se recupera dirección de retorno • Se libera el área de datos de la función (e.g., variables locales) • Se restablece el control para la rutina que llama y se guardan valores de retorno de la función • Note que la cadena de direcciones de retorno forma una pila. Es decir, la dirección de retorno más reciente es la primera que se remueve de la cadena, y únicamente podemos acceder a la dirección de retorno dentro de la que se ejecuta la función (el tope)

  17. Simulación de recursión usando pilas Versión simulada con Pilas • Ejemplo: Factorial(n) intsimfactorial(int n) { struct stack s; int x = n; long int prod; s.top = -1; while (x != 0) { push(&s, x--); } prod = 1; while (s.top >= 0) { prod *= pop(&s); } return prod; } Versión Recursiva Encadenamiento int factorial(int n) { if (n == 0) return 1; return n * factorial(n – 1); } Recursión

More Related