#!/usr/bin/env python # coding: utf-8 # # Tema 28: Introducción a la programación imperativa con Python # # # ---------- # # [José A. Alonso](https://www.cs.us.es/~jalonso) # [Departamento de Ciencias de la Computación e I.A.](https://www.cs.us.es) # [Universidad de Sevilla](http://www.us.es) # Sevilla, 23 de agosto de 2019 # > __Nota:__ La versión interactiva de este tema se encuentra en [Binder](https://mybinder.org/v2/gh/jaalonso/Temas_interactivos_de_PF_con_Haskell/master?urlpath=lab/tree/temas/Tema-28.ipynb). # # Python como calculadora # In[5]: 2 * 5 + 6 - (100 + 3) # In[6]: 8/2, 8/4 # In[7]: 7 // 2, 7 % 2 # In[8]: 2 ** 10 # # Variables y asignaciones # In[9]: a = 8 b = 2 * a b # In[10]: a + b # In[11]: a = a + 1 a # In[12]: a, b = 2, 5 a + 2 * b # # Definición de funciones # **Ejercicio 1**. Definir la función suma tal que suma(x, y) es la suma de x e y. . Por ejemplo, # ~~~ # >>> suma(2,3) # 5 # ~~~ # In[13]: def suma(x, y): return x+y # In[14]: suma(2, 3) # # Escritura y lectura # **Ejercicio 2.** Definir el procedimiento suma que lea dos números y escriba su suma. Por ejemplo, # ~~~ # >>> suma() # Escribe el primer número: 2 # Escribe el segundo número: 3 # La suma es: 5 # ~~~ # In[15]: def suma(): a = eval(input("Escribe el primer número: ")) b = eval(input("Escribe el segundo número: ")) print("La suma es:",a+b) # In[16]: suma() # # La estructura condicional # ## Condicionales simples # **Ejercicio 3.** Definir, usando condicionales, la función maximo tal que maximo(x,y) es el máximo de x e y. Por ejemplo, # ~~~ # >>> maximo(2, 5) # 5 # >>> maximo(2, 1) # 2 # ~~~ # In[17]: def maximo(x, y) : if x > y: return x else: return y # In[18]: maximo(2, 5) # In[19]: maximo (2, 1) # ## Condicionales múltiples # **Ejercicio 4.** Definir la función signo tal que signo(x) es el signo de x. Por ejemplo, # ~~~ # >>> signo(5) # 1 # >>> signo(-7) # - 1 # >>> signo(0) # 0 # ~~~ # In[20]: def signo(x): if x > 0: return 1 elif x < 0: return -1 else: return 0 # In[21]: signo(5) # In[22]: signo(-7) # In[23]: signo(0) # # Estructuras iterativas # ## Bucles mientras # **Ejercicio 5.** Definir, con un bucle while, la función sumaImpares tal que sumaImpares(n) es la suma de los n primeros números impares. Por ejemplo, # # ~~~ # >>> sumaImpares(3) # 9 # >>> sumaImpares(4) # 16 # ~~~ # In[24]: def sumaImpares(n): s, k = 0, 0 while k < n: s = s + 2*k + 1 k = k + 1 return s # In[25]: sumaImpares(3) # In[26]: sumaImpares(4) # **Ejercicio 6.** Definir la función mayorExponente tal que mayorExponente(a,n) es el mayor k tal que a^k divide a n. Por ejemplo, # # ~~~ # >>> mayorExponente(2,40); # 3 # ~~~ # In[27]: def mayorExponente(a, n): k = 0 while (n % a == 0): n = n/a k = k + 1 return k # In[28]: mayorExponente(2, 40) # ## Bucle para # **Ejercicio 7.** Definir, por iteración con for, la función fact tal que fact(n) es el factorial de n. Por ejemplo, # # ~~~ # >>> fact 4 # 24 # ~~~ # In[29]: def fact(n): f = 1 for k in range(1,n+1): f = f * k return f # In[30]: fact(4) # ## Bucle para sobre listas # **Ejercicio 8.** Definir, por iteración, la función suma tal que suma(xs) es a suma de los números de la lista xs. Por ejemplo, # ~~~ # >>> suma([3,2,5]) # 10 # ~~~ # In[31]: def suma(xs): r = 0 for x in xs: r = x + r return r # In[32]: suma([3, 2, 5]) # # Recursión # **Ejercicio 9.** Definir, por recursión, la función fact tal que factR(n) es el factorial de n. Por ejemplo, # ~~~ # >>> fact 4 # 24 # ~~~ # In[33]: def fact(n): if n == 0: return 1 else: return n * fact(n-1) # In[34]: fact(4) # # La función de Takeuchi # In[35]: def tak(x,y,z): if x <= y: return y else: return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y)) # Importación de la librería para medir el tiempo. # In[36]: import time # Primer experimento # In[37]: tiempo_inicial = time.time() tak(12,6,1) print("Tiempo = %s segundos " % (time.time() - tiempo_inicial)) # Segundo experimento # In[38]: tiempo_inicial = time.time() tak(13,6,1) print("Tiempo = %s segundos " % (time.time() - tiempo_inicial)) # Tercer experimento # In[39]: tiempo_inicial = time.time() tak(14,6,1) print("Tiempo = %s segundos " % (time.time() - tiempo_inicial)) # Cuarto experimento # In[40]: tiempo_inicial = time.time() tak(16,6,1) print("Tiempo = %s segundos " % (time.time() - tiempo_inicial))