Licenciatura de Matemáticas Algorítmica y Lenguajes de Programación Segundo examen parcial Universidad de Oviedo 20/06/2001 Apellidos: Nombre: D.N.I: Notas: 1. 2. 3. 1. Todos los ejercicios se resolverán empleando la notación algorítmica explicada en clase. Implementar únicamente aquello que se pide en cada caso (una función, una acción o un programa). Los ejercicios puntuarán de la siguiente forma: • Ejercicios 1, 2 y 5: 1,5 puntos. • Ejercicio 3 y 4: 2,75 puntos. El algoritmo de Euclides permite calcular el máximo común divisor de dos números de forma rápida; dicho algoritmo se basa en la siguiente propiedad: Si A y B son enteros entonces MCD (A, B) = MCD (A-B, B) Escribir una función recursiva que calcule el máximo común divisor de dos números basándose en dicha propiedad. Posible solución: funcion mcd (a,b ∈ entero) dev (c ∈ entero) inicio si a=b entonces c ß a si no si a>b entonces c ß mcd(a-b, b) si no c ß mcd (b-a, a) fsi fsi fin 2. Escribir una acción recursiva que lea números enteros por teclado (un número por línea) hasta que se teclee un –1 y que escriba la secuencia de números introducida de forma inversa. accion leeInvierte () variables n ∈ entero inicio leer n si n≠ ≠ -1 entonces leer() fsi escribir n !Repite el -1 fin Posible solución (II): accion leeInvierte () variables n ∈ entero inicio leer n si n≠ ≠ -1 entonces leer() escribir n !No repite el -1 fsi fin 3. Dada la siguiente estructura de datos: estructura Complejo r ∈ real i ∈ real acción construye (x,y ∈ real) dev (a ∈ Complejo) inicio a.r ß x a.i ß y fin acción escribir () inicio si a.i ≠ 0 entonces escribir a.r, ‘+’, a.i, ‘i’ si no escribir a.r fsi fin festructura Escribir una acción que utilice dicha estructura e imprima las soluciones de ax2 + bx + c = 0 sean reales o complejas. Posible solución: accion segundoGrado (a,b,c ∈ real) variables s1,s2 ∈ Complejo discr ∈ real inicio discr ß b2-4ac si discr=0 entonces s1.construye(-b/(2a),0) s2.construye(-b/(2a),0) si no si discr>0 entonces s1.construye((-b + √discr)/(2a),0) s2.construye((-b - √discr)/(2a),0) si no s1.construye(-b/(2a),√|discr|/(2a)) s2.construye(-b/(2a),-√|discr|/(2a)) fsi fsi escribir ‘Las soluciones de la ecuación son:’ s1.escribir() s2.escribir() fin 4. Completar las acciones que se indican en la siguiente estructura para que se comporte como una cola ordenada de forma ascendente. estructura Lista dato ∈ entero sig ∈ ↑Lista acción inicia (x ∈ entero) dev (a ∈ Lista) inicio a.dato ß x a.sig ß NIL fin acción insertar (x ∈ entero) inicio ! COMPLETAR ESTA ACCIÓN fin función buscar (x ∈ entero) dev (a ∈ booleano) inicio ! COMPLETAR ESTA ACCIÓN fin festructura Posible solución: accion insertar (x ∈ entero) variables nuevo ∈ Lista temp ∈ entero inicio si x<dato entonces nuevo.inicia(x) nuevo.sig ß sig sig ß ↑nuevo temp ß dato dato ß nuevo.dato nuevo.dato ß temp si no si sig=NIL entonces nuevo.inicia(x) sig ß ↑nuevo si no sig.insertar(x) fsi fsi fin funcion buscar (x ∈ entero) dev (a ∈ booleano) inicio si dato=x entonces a ß verdadero si no si sig=NIL entonces a ß falso si no a ß sig.buscar(x) fsi fsi fin 5. Escribir una acción que ordene un vector de 100 números enteros y calcular su complejidad. Se implementa el método de la burbuja: ∈ vector[100] de entero) variables i,j ∈ entero temp ∈ entero inicio para i de 2 a 100 hacer para j de 100 a 1 hacia atrás hacer si v[j-1] > v[j] entonces temp ß v[j-1] v[j-1] ß v[j] v[j] ß temp fsi fpara fpara fin La complejidad del algoritmo anterior sería O(1), constante, puesto que siempre se tarda lo mismo en ordenar 100 elementos, si en lugar de 100 elementos el vector pudiera tener diferente longitud, n, la complejidad sería diferente: para i de 2 a n hacer para j de n a 1 hacia atrás hacer si v[j-1] > v[j] entonces temp ß v[j-1] v[j-1] ß v[j] v[j] ß temp fsi fpara fpara El orden de complejidad de cada sentencia es O(1), constante, al ser una secuencia se debe coger la dominante de las tres, al ser las tres O(1) la complejidad de esta parte del algoritmo es O(1). para i de 2 a n hacer para j de n a 1 hacia atrás hacer si v[j-1] > v[j] entonces O(1) fsi fpara fpara para i de 2 a n hacer para j de n a 1 hacia atrás hacer O(1) fpara fpara para i de 2 a n hacer O(n) fpara El orden de complejidad de una estructura si-entonces-sino es la dominante entre la complejidad de la condición y la de las sentencias a ejecutar; esta condición tiene un tiempo de ejecución constante, por tanto, complejidad O(1), la dominante entre O(1) y O(1) es O(1). La complejidad de un bucle es O(n·s) donde n es el número de ejecuciones y s es la complejidad de las sentencias del interior del bucle, en este caso el número de ejecuciones es n, con lo que la complejidad de este bucle es O(n·1), es decir, O(n). La complejidad de un bucle es O(n·s) donde n es el número de ejecuciones y s es la complejidad de las sentencias del interior del bucle, en este caso el número de ejecuciones es n-1, con lo que la complejidad de este bucle es O((n-1)·n), es decir, O(n 2n). Aplicando la regla que dice que O(a+b) es la dominante entre O(a) y O(b) y sabiendo que O(n2) domina a O(n) entonces la complejidad final del algoritmo es O(n2). Conclusión: El algoritmo tiene un orden de complejidad O(n2)