Introducción a la Computación Examen de diciembre de 2012 con solución Ejercicio 1: i Escribir una función tabla que reciba un natural e imprima en pantalla la tabla de productos (en la fila i columna j debe aparecer i ∗ j). Ejemplo tabla(4) imprime 1 2 3 4 2 3 4 4 6 8 6 9 12 8 12 16 Solución: def tabla(n): for i in range (1,n+1): for j in range (1, n+1): print i*j, print "\n", ii Escribir una función ordenada que reciba una lista de números devuelva True en caso de que la lista esté ordenada en forma creciente. Solución (posibilidad recursiva): def ordenada(l): if len(l)<=1: return True else: return l[0]<=l[1] and ordenada(l[1:]) Solución (posibilidad iterativa): def ordenada(l): ord=True i=0 while i<len(l)-1 and ord: if l[i]>l[i+1]: ord=False i=i+1 return ord iii Implementar una función iterativa negativo que reciba una lista de números y devuelva el primer número negativo que aparece en la lista. Si no hay números negativos debe devolverse 0. Solución: def negativo(l): res = 0 noNeg=True i=0 while i<len(l) and noNeg: if l[i]<0: res=l[i] noNeg=False i=i+1 return res iv Hacer la función anterior recursivamente. Solución: def negativo(l): if l==[]: return 0 else: if l[0]<0: return l[0] else: return negativo(l[1:]) Ejercicio 2: i Escribir en Python un programa que solicite números al usuario hasta que éste ingrese el valor 0. Luego mostrar en pantalla la suma, el promedio, el máximo y el mı́nimo. Solución: print "ingrese números seguidos por la tecla enter, finaliza con 0" num = input() suma = num i=1 maxi = num mini = num while num!=0: num = input() if num!=0: suma = suma + num if num > maxi: maxi = num if num < mini: mini = num i = i+1 print "sum %d, prom %d, max %d, min %d:" %(suma, suma/i, maxi, mini) ii Modificar el programa anterior para que termine de solicitar números cuando se ingrese el primer número repetido. Solución: print "ingrese números, finaliza ingresando repetidos" num = input() lista=[num] suma = num i=1 maxi = num mini = num num = input() while num not in lista: lista.append(num) suma = suma + num if num > maxi: maxi = num if num < mini: mini = num i = i+1 num = input() print "sum %d, prom %d, max %d, min %d:" %(suma, suma/i, maxi, mini) Ejercicio 3: Para representar matrices cuadradas n × n se utiliza un diccionario que bajo la clave "dim" tiene la dimensión n, bajo la clave (i,j) tiene la entrada de la matriz que se encuentra en la fila i y columna j (donde i y j son números entre 1 y n). i Indicar cómo se crea en Python, usando el criterio indicado, la matriz 1 2 3 4 ! Solución: matriz = {(1,1):1, (1,2):2, (2,1):3, (2,2):4, "dim":2} ii Implementar una función suma que reciba dos diccionarios que representan matrices y devuelvan el diccionario que representa la matriz suma (puede asumir que las matrices a sumar tienen la misma dimensión). Solución: def suma(mat1, mat2): matsuma={} for i mat1.keys(): matsuma[i]=mat1[i]+mat2[i] matsuma["dim"]=mat1["dim"] return matsuma iii Implementar una función quitar que reciba una matriz M (representada por un diccionario) y un par de naturales i, j y devuelva el diccionario correspondiente a la matriz que resulta de quitar la fila i y la columna j de la matriz original. (puede asumir que i y j son valores correctos para la matriz M) Solución def quitar(M, i,j): res = dict(M) for k in range(1,M["dim"]+1): res.pop((i,k)) res.pop((k,j)) res[dim]=res[dim]-1 return res iv Usando la parte anterior implementar una función recursiva determinante que calcule el determinante de una matriz utilizando el desarrollo por una fila. Recuerde que: • el determinante de una matriz 1 × 1 es la única entrada de ésta. • el determinante de cualquier otra matriz n × n puede calcularse (desarrollando por la primera fila) como n X (−1)1+j a1j determinante(M1j ) j=1 donde a1j es la entrada de la matriz M que se encuentra en la fila 1, columna j y M1j es el resultado de quitar a la matriz original la primera fila y la j-ésima columna. Solución def determinante(M): if M["dim"]==0: return 0 elif M["dim"]==1: return M[(1,1)] else: det = 0 for j in range(1,M["dim"]+1): det=det+(-1)**(1+j)*M[(1,j)*determinante(quitar(M,1,j)) return det