Recursión en Python 3: Un Enfoque Detallado

La recursión es un concepto fundamental en la programación y las ciencias de la computación. En Python, la recursión se utiliza para resolver problemas dividiéndolos en subproblemas más pequeños del mismo tipo. En este artículo, exploraremos en profundidad el concepto de recursión en Python 3, desde su definición hasta su implementación y optimización.


1. ¿Qué es la Recursión?

La recursión es una técnica de programación en la que una función se llama a sí misma para resolver un problema. Cada llamada a la función recursiva reduce el problema a una versión más simple del mismo hasta que se alcanza una condición base que detiene la recursión.

Ejemplo básico de recursión:

 def cuenta_regresiva(n):
     if n <= 0:  # Condición base
         print("Fin de la cuenta regresiva")
     else:
         print(n)
         cuenta_regresiva(n - 1)  # Llamada recursiva

 cuenta_regresiva(5)

2. Factores Clave de la Recursión

a) Condición Base

Cada función recursiva debe tener una condición base para evitar llamadas infinitas.

b) Llamada Recursiva

La función debe llamarse a sí misma con un argumento modificado, acercándose a la condición base.

c) Pila de Llamadas

Python usa una pila para gestionar las llamadas recursivas. Cada llamada se almacena en la pila hasta que se alcanza la condición base y la ejecución comienza a resolverse en orden inverso.


3. Ejemplos Clásicos de Recursión

a) Factorial de un Número

def factorial(n):
    if n == 0 or n == 1:
        return 1
    return n * factorial(n - 1)

print(factorial(5))  # Salida: 120

b) Fibonacci Recursivo

def fibonacci(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(6))  # Salida: 8

4. Optimización de Recursión

Las funciones recursivas pueden volverse ineficientes debido a la repetición de cálculos. Algunas estrategias para optimizar incluyen:

a) Memorización (Memoization)

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci_memo(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    return fibonacci_memo(n - 1) + fibonacci_memo(n - 2)

print(fibonacci_memo(6))

b) Recursión de Cola

Python no optimiza la recursión de cola de forma nativa, pero se puede reescribir una función para evitar profundidades innecesarias:

def factorial_tail(n, acum=1):
    if n == 0:
        return acum
    return factorial_tail(n - 1, acum * n)

print(factorial_tail(5))

c) Conversión a Iteración

En algunos casos, las funciones recursivas pueden reformularse como iteraciones para mejorar el rendimiento.

def factorial_iterativo(n):
    resultado = 1
    for i in range(2, n + 1):
        resultado *= i
    return resultado

print(factorial_iterativo(5))

5. Aplicaciones de la Recursión

a) Búsqueda Binaria

def busqueda_binaria(lista, objetivo, izquierda, derecha):
    if izquierda > derecha:
        return -1
    medio = (izquierda + derecha) // 2
    if lista[medio] == objetivo:
        return medio
    elif lista[medio] < objetivo:
        return busqueda_binaria(lista, objetivo, medio + 1, derecha)
    else:
        return busqueda_binaria(lista, objetivo, izquierda, medio - 1)

lista = [1, 3, 5, 7, 9, 11]
print(busqueda_binaria(lista, 7, 0, len(lista) - 1))  # Salida: 3

b) Torres de Hanoi

def hanoi(n, origen, destino, auxiliar):
    if n == 1:
        print(f"Mover disco de {origen} a {destino}")
        return
    hanoi(n - 1, origen, auxiliar, destino)
    print(f"Mover disco de {origen} a {destino}")
    hanoi(n - 1, auxiliar, destino, origen)

hanoi(3, 'A', 'C', 'B')

Conclusión

La recursión es una poderosa herramienta en Python 3 que permite resolver problemas dividiéndolos en subproblemas más pequeños. Sin embargo, su uso debe ser controlado para evitar problemas de rendimiento y desbordamiento de pila. Optimizar la recursión con técnicas como la memorización y la conversión a iteración es clave para mejorar la eficiencia de los algoritmos. Al dominar la recursión, los programadores pueden abordar una amplia variedad de problemas de manera efectiva.

0
Subscribe to my newsletter

Read articles from Jorge Leonardo Cespedes Tapia directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Jorge Leonardo Cespedes Tapia
Jorge Leonardo Cespedes Tapia

I software engineer. Developer Python. I read books. I watch movies. I writer fiction. I am a black cat. And You?