def suma_i (n): """ Tarea: Suma de Gauss hasta el entero positivo 'n', version iterativa. Entra: n : entero positivo 'n' Retorna: z : suma de (1 + 2 + ... + n). """ z = 0 # inicializa acumulador for i in range (n+1): z = z + i return z def suma_r (n): """ Tarea: Suma de Gauss hasta el entero positivo 'n', version recursiva. Entra: n : entero positivo 'n' Retorna: z : suma de (1 + 2 + ... + n). """ if (n > 1): # paso recursivo z = n + suma_r (n-1) else: # paso base z = 1 return z def maximo_i (A): """ Tarea: Encuentra el primer elemento maximo de una lista, version iterativa. Entra: A : lista dato Retorna: vmax: el primer elemento maximo de la lista A. """ # basta hacer una unica pasada vmax = A [0] # toma el 1er valor for x in A [1:]: # recorre desde el 2do valor hasta el final if (x > vmax): vmax = x # define el valor de retorno (escalar) return vmax def maximo_r (A): """ Tarea: Encuentra el primer elemento maximo de una lista, version recursiva. Entra: A: lista dato. Retorna: z: el primer elemento maximo de la lista A. """ n = len (A) if (n == 1): z = A [0] else: b = maximo_r (A[0:n-1]) # llamada recursiva z = maxde2valores (b, A[n-1]) # obtiene el max entre 2 valores return z def maxde2valores (a,b): """ Tarea: Auxiliar de la funcion "maximo_r": retorna el maximo entre 2 valores. Entra: a, b : dos valores Retorna: z : el mayor entre 'a' y 'b' """ if (a >= b): z = a else: z = b return z def maxloc (A): """ Tarea: Devuelve el maximo valor 'xmax' y su primera posicion 'imax' en la lista 'A', version con lazo. Entrada: A : lista de elementos. Salida: Retorna la tupla (xmax,imax). """ n = len (A) if (n == 0): # nada que hacer print('*** secuencia vacia') (xmax, imax) = (None, None) else: (xmax, imax) = (A[0], 0) # inicializa tupla for i in range (1, n): if (A [i] > xmax): # solo si es mayor (xmax, imax) = (A[i], i) # a la salida del bloque 'if' return (xmax, imax) def minloc (A): """ Tarea: Devuelve el minimo valor 'xmin' y su primera posicion 'imin' en la lista 'A', version con lazo. Entrada: A : lista de elementos. Salida: Retorna la tupla (xmin,imin). """ n = len (A) if (n == 0): # nada que hacer print('*** secuencia vacia') (xmin, imin) = (None, None) else: (xmin, imin) = (A[0], 0) # inicializa tupla for i in range (1, n): if (A [i] < xmin): # solo si es mayor (xmin, imin) = (A[i], i) # a la salida del bloque 'if' return (xmin, imin) def a_n21 (n): """ Tarea: Calculo del termino enesimo de la sucesion a_0 = 1, a_1 = 1, y a_n = a_{n-1} a_{n-2}, para n = 2, 3, 4, ..., Rosen, 5ta edicion, E21, pag. 264. version recursiva. Entra: n : entero positivo. Retorna: z : valor del termino enesimo de la sucesion. """ if (n == 0): z = 1 elif (n == 1): z = 2 else: z = a_n21 (n-1) * a_n21 (n-2) return z def a_n24 (n): """ Tarea: Calculo del termino enesimo de la sucesion a_0 = 1, a_1 = 2, a_2 = 3, y a_n = a_{n-1} + a_{n-2} + a_{n-3}, para n = 3, 4, 5, ..., Rosen, 5ta edicion, E24, pag. 264. version recursiva. Entra: n : entero positivo. Retorna: z : valor del termino enesimo de la sucesion. """ if (n == 0): z = 1 elif (n == 1): z = 2 elif (n == 2): z = 3 else: z = a_n24 (n-1) + a_n24 (n-2) + a_n24 (n-3) return z def factorial_i (n): """ Tarea: Calculo del factorial del entero no-negativo n, version iterativa. Entra: n : entero positivo. Retorna: z : valor del factorial de n. """ z = 1 for i in range (1,n): z = z * i return z def factorial_r (n): """ Tarea: Calculo del factorial del entero no-negativo n, version recursiva. Entra: n : entero positivo. Retorna: z : valor del factorial de n. """ if (n > 0): # paso recursivo z = n * factorial_r (n-1) else: # paso base z = 1 return z def potencia_i (a, n): """ Tarea: Calculo de la potencia z = a^n de un numero 'a', para entero positivo 'n'. version iterativa. Entra: a : numero cuya potencia se busca. n : entero positivo. Retorna: z : valor de la potencia 'n' de 'a'. """ # assert n >= 0 # se puede omitir r = 1 for i in range (n): r = r * a return r def potencia_r (a, n): """ Tarea: Calculo de la potencia z = a^n de un numero 'a', para entero positivo 'n'. version recursiva. Entra: a : numero cuya potencia se busca. n : entero positivo. Retorna: z : valor de la potencia 'n' de 'a'. """ # assert n >= 0 # se puede omitir if (n > 0): # paso recursivo z = a * potencia_r (a, n-1) else: # paso base z = 1 return z def mcd_i (a, b): """ Tarea: Maximo Comun Divisor de los enteros a y b, version iterativa. Entra: a, b : enteros positivos, asumimos a > b. Retorna: x : el mcd (a,b). """ # Algunos controles omitidos. a = abs (a) # debe ser positivo. b = abs (b) # debe ser positivo. # if (a > b): # intercambio para tener a < b # t = a # a = b # b = t # # tarea especifica (x, y) = (a, b) # copia while (y != 0): # lazo de repeticion r = x % y # x mod y (x, y) = (y, r) # pisa valores return x def mcd_r (a, b): """ Tarea: Maximo Comun Divisor de los enteros a y b, version recursiva. Entra: a, b : enteros positivos, asumimos a > b. Retorna: x : el mcd (a,b). Maximo Comun Divisor de los enteros a y b, version recursiva, suponemos a > b """ # Algunos controles omitidos. # assert a >= 0 # habria que preverlo. # assert b >= 0 # habria que preverlo. # if (a > b): # intercambio para tener a < b # t = a # a = b # b = t # # tarea especifica if (a == 0): # paso base z = b else: # paso recursivo r = b % a z = mcd_r (b % a, a) return z # some basic tests: omitir ver desde aqui hasta el final def test01 (): n = 100 z = suma_i (n) print ('La suma 1 + 2 + ... + n, con n = ', n) print ('es igual a ', z, ' (version iterativa) \n') return def test02 (): n = 100 z = suma_r (n) print ('La suma 1 + 2 + ... + n, con n = ', n) print ('es igual a ', z, ' (version recursiva) \n') return def test03 (): A = [ 1, 0, 3, 8, 5, 6, 7, 4, 9, 2 ] z = maximo_i (A) print ('El primer maximo de la lista A = ', A) print ('es igual a ', z, ' (version iterativa) \n') return def test04 (): A = [ 1, 0, 3, 8, 5, 6, 7, 4, 9, 2 ] z = maximo_r (A) print ('El primer maximo de la lista A = ', A) print ('es igual a ', z, ' (version recursiva) \n') return def test05 (): A = [ 1, 0, 3, 8, 5, 6, 7, 4, 9, 2 ] (zmax, imax) = maxloc (A) print ('El primer maximo de la lista A = ', A) print ('es igual a ', zmax, ' en la posicion ', imax, '\n') return def test06 (): A = [ 1, 0, 3, 8, 5, 6, 7, 4, 9, 2 ] (zmin, imin) = minloc (A) print ('El primer minimo de la lista A = ', A) print ('es igual a ', zmin, ' en la posicion ', imin, '\n') return def test07 (): a = 612 b = 456 z = mcd_i (a,b) print ('El mcd de ', a, ' y de ', b) print ('es igual a ', z, ' (version iterativa) \n' ) return def test08 (): a = 612 b = 456 z = mcd_r (a,b) print ('El mcd de ', a, ' y de ', b) print ('es igual a ', z, ' (version recursiva) \n' ) return def test09 (): n = 12 z = a_n21 (n) print ('Rosen, 5ta edicion, E21, pag. 264. ') print ('Calculo del termino enesimo de la sucesion') print ('a_0 = 1, a_1 = 1, y a_n = a_{n-1} a_{n-2},') print ('para n = 2, 3, 4, ..., version recursiva. ') print ('Cuando n = ', n, ' es a_n = ', z, '\n') return def test10 (): n = 17 z = a_n24 (n) print ('Rosen, 5ta edicion, E24, pag. 264. ') print ('Calculo del termino enesimo de la sucesion') print ('a_0 = 1, a_1 = 2, a_2 = 3, y ') print ('a_n = a_{n-1} + a_{n-2} + a_{n-3} ') print ('para n = 3, 4, 5, ..., version recursiva. ') print ('Cuando n = ', n, ' es a_n = ', z, '\n') return def test11 (): n = 4 z = factorial_i (n) print ('El factorial de ', n) print ('es igual a ', z , ' (version iterativa) \n' ) n = 5 z = factorial_i (n) print ('El factorial de ', n) print ('es igual a ', z , ' (version iterativa) \n' ) n = 6 z = factorial_i (n) print ('El factorial de ', n) print ('es igual a ', z , ' (version iterativa) \n' ) return def test12 (): n = 800 z = factorial_r (n) print ('El factorial de ', n) print ('es igual a ', z, ' (version recursiva) \n' ) return if __name__== "__main__": test01 () test02 () test03 () test04 () test05 () test06 () test07 () test08 () test09 () test10 () test11 () test12 () #end