5. Abstracción con funciones¶
Como ya comentamos en la introducción, la abstracción es la
herramienta más potente que tenemos para manejar problemas grandes.
Abstraer es simplificar, dejar de lado los detalles para concentrarse
en lo fundamental. Eso es justo lo que hacemos al usar una función,
al emplear la expresión de llamada. Al llamar a una función no nos
preocupa cómo funciona por dentro, sino solamente lo que hace. ¿A que
no te has preguntado cómo es la función print
por dentro? Y sin
embargo estás usándola desde tu primer programa. Acostúmbrate a hacer
lo mismo cuando usas tus propias funciones. No pienses en cómo están
hechas, sino en qué hacen. Ya te ocuparás del cómo más adelante.
Usar funciones (la expresión de llamada) no debería resultar nada nuevo, porque es complétamente análogo al uso de funciones en matemáticas. Cuando se utiliza una función, como \(max(x,y)\) no nos preocupa cómo está definida, sino simplemente lo que hace, como si se tratara de una caja negra, y la utilizamos sin ni siquiera pensar en la definición.
5.1. Recursión¶
Ejercicio: Implementar el factorial de forma iterativa y recursiva
def fact(n):
if (n < 2):
return 1
return n*fact(n-1)
def fact_iter(n):
res = 1
for i in range(n,1,-1):
res *= i
return res
assert(fact(10) == fact_iter(10))
Ejercicio: implementar una función para saber si un texto es palíndromo.
def es_palindromo(texto):
return es_simetrico(extraer_letras(texto))
def extraer_letras(texto):
letras = ''
for c in texto.lower():
if c.isalpha():
letras += c
return letras
def es_simetrico(s):
if len(s) < 2:
return True
return s[0] == s[-1] and es_simetrico(s[1:-1])
print(es_palindromo('Dabale arroz a la zorra el abad.'))
True
5.2. Recursión¶
Ejercicio: Implementar de forma recursiva un programa que dibuje la curva de Koch
Este tipo de dibujos se puede hacer facilmente con el módulo turtle
de la biblioteca estándar. Nosotros vamos a usar una versión de
turtle
que funciona en los cuadernos. Se llama mobilechelonian
pero funciona igual que turtle
.
def koch(t, N, n=None):
if n == None:
n = N
if n == 0:
t.forward(400/3**N)
return
for angulo in (-60, 120, -60, 0):
koch(t, N, n-1)
if angulo < 0:
t.left(-angulo)
else:
t.right(angulo)
from mobilechelonian import Turtle
t = Turtle()
t.speed(10)
t.penup()
t.goto(-200,0)
t.pendown()
t.pensize(3)
koch(t, 4)
t.penup()
t.home()