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()
Next Section - 6. Listas, tuplas, conjuntos y diccionarios