La recurvisidad
1. Qué es la recursividad? #
La recursividad es una técnica de programación en la que una función se llama a sí misma para resolver un problema. Un problema se divide en subproblemas más pequeños, y la función resuelve cada subproblema llamándose a sí misma. Es especialmente útil para problemas que se pueden descomponer en tareas repetitivas más simples.
2. Cómo funciona la recursividad? #
Para que la recursividad funcione correctamente, una función recursiva debe tener dos cosas:
- Caso base: La condición que detiene la recursión. Es la situación en la que la función deja de llamarse a sí misma.
- Llamada recursiva: La parte de la función que se llama a sí misma para resolver el problema.
3. Ejemplo de recursividad: Factorial de un número #
El factorial de un número n (escrito como n!) es el producto de todos los números enteros positivos desde 1 hasta n. Por ejemplo, 5! = 5 * 4 * 3 * 2 * 1 = 120.
Podemos calcular el factorial de un número usando recursividad.
1def factorial(n): 2 # Caso base: si n es 1 o 0, el factorial es 1 3 if n == 1 or n == 0: 4 return 1 5 # Llamada recursiva: n * factorial de n-1 6 else: 7 return n * factorial(n - 1) 8 9# Llamar a la función y mostrar el resultado 10resultado = factorial(5) 11print(f"El factorial de 5 es: {resultado}")Salida de consola El factorial de 5 es: 120
- ¿Qué hace este código?:
- Define una función
factorial(n)que calcula el factorial de un número usando recursividad. - El caso base es cuando
nes1o0, donde el factorial es1. - Si
nes mayor que1, la función se llama a sí misma conn - 1, multiplicandonpor el resultado defactorial(n - 1).
- Define una función
4. Ejemplo de recursividad: Sucesión de Fibonacci #
La sucesión de Fibonacci es una serie de números en la que cada número es la suma de los dos anteriores. La serie comienza con 0 y 1, por lo que la secuencia es: 0, 1, 1, 2, 3, 5, 8, ....
Podemos calcular el n-ésimo número de la sucesión de Fibonacci usando recursividad.
1def fibonacci(n): 2 # Caso base: Fibonacci de 0 es 0, y de 1 es 1 3 if n == 0: 4 return 0 5 elif n == 1: 6 return 1 7 # Llamada recursiva: suma de los dos Fibonacci anteriores 8 else: 9 return fibonacci(n - 1) + fibonacci(n - 2) 10 11# Llamar a la función y mostrar el resultado 12resultado = fibonacci(6) 13print(f"El 6º número de la sucesión de Fibonacci es: {resultado}")Salida de consola El 6º número de la sucesión de Fibonacci es: 8
- ¿Qué hace este código?:
- Define una función
fibonacci(n)que calcula eln-ésimo número en la sucesión de Fibonacci usando recursividad. - El caso base es cuando
nes0o1. - Si
nes mayor que1, la función se llama a sí misma para calcular los dos números anteriores y los suma.
- Define una función
5. Por qué usar recursividad? #
La recursividad es útil cuando un problema se puede dividir naturalmente en subproblemas similares. Es una forma elegante y directa de resolver problemas como cálculos factoriales, secuencias como la de Fibonacci, recorridos en estructuras de datos como árboles, y muchos otros.
6. Precauciones con la recursividad #
- Caso base: Siempre asegúrate de que tu función recursiva tenga un caso base para evitar llamadas infinitas y potencialmente bloquear tu programa.
- Eficiencia: A veces, la recursividad puede ser menos eficiente que otras soluciones iterativas debido al costo de las múltiples llamadas a funciones. Considera la eficiencia, especialmente con problemas como la sucesión de Fibonacci.
Resumen del tema
Conceptos clave #
- Mecanismo Recursivo: función que se invoca a sí misma para resolver instancias más pequeñas del mismo problema.
- Componentes Obligatorios:
- Caso Base: condición de parada que retorna un resultado directo sin llamadas recursivas.
- Paso Recursivo: llamada a sí misma avanzando hacia el caso base.
- Límite de Recursión (RecursionError): Python cuenta con un límite de profundidad de pila de llamadas (
sys.getrecursionlimit(), ~1000 por defecto) para evitar desbordamiento del stack.
Qué debes recordar #
Toda función recursiva debe definir un caso base claro para detener las llamadas y evitar errores de desbordamiento de pila (RecursionError).