Recursión
Resuelve un problema llamando a una función dentro de sí misma.
Resumen Rápido
La recursión divide un problema grande en versiones más pequeñas de sí mismo. Siempre incluye un caso base para que la función se detenga, o tendrás un error de pila de llamadas. La recursión es elegante para estructuras de árbol y secuencias matemáticas.
¿Qué es la Recursión?
La recursión es cuando una función se llama a sí misma para resolver un problema. Es como las muñecas rusas anidadas — cada muñeca contiene una versión más pequeña de sí misma.
Las Dos Partes Esenciales
- Caso Base: Cuándo DEJAR de hacer recursión
- Caso Recursivo: Llamarse a sí misma con un problema más pequeño
function countdown(n) {
// Base case: stop at 0
if (n <= 0) {
console.log("Done!");
return;
}
// Recursive case: count down
console.log(n);
countdown(n - 1);
}
Ejemplo Clásico: Factorial
El factorial de n (escrito n!) = n × (n-1) × (n-2) × ... × 1
// 5! = 5 × 4 × 3 × 2 × 1 = 120
function factorial(n) {
if (n <= 1) return 1; // Base case
return n * factorial(n - 1); // Recursive case
}
// How it works:
// factorial(5)
// → 5 * factorial(4)
// → 5 * 4 * factorial(3)
// → 5 * 4 * 3 * factorial(2)
// → 5 * 4 * 3 * 2 * factorial(1)
// → 5 * 4 * 3 * 2 * 1
// → 120
Cuándo Usar Recursión
- Recorrido de árboles/grafos
- Estructuras de datos anidadas
- Secuencias matemáticas (factorial, Fibonacci)
- Algoritmos divide y vencerás
Recursión vs Bucles
Muchas soluciones recursivas se pueden escribir como bucles:
// Recursive
function sumRecursive(n) {
if (n <= 0) return 0;
return n + sumRecursive(n - 1);
}
// Loop (often more efficient)
function sumLoop(n) {
let total = 0;
for (let i = 1; i <= n; i++) {
total += i;
}
return total;
}
Cuidado: Desbordamiento de Pila
Cada llamada recursiva usa memoria. Demasiadas llamadas = error.
// This will crash!
function infinite() {
return infinite(); // No base case!
}
Pruébalo Tú Mismo
Aquí tienes un ejemplo práctico que puedes probar. Copia este código y ejecútalo en la consola de tu navegador (presiona F12 para abrir las herramientas de desarrollo) o en el Playground de Código.
// Factorial: n! = n × (n-1) × ... × 1
function factorial(n) {
if (n <= 1) return 1; // Base case
return n * factorial(n - 1); // Recursive case
}
console.log(factorial(5)); // 120
// Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, ...
function fibonacci(n) {
if (n <= 1) return n; // Base cases: fib(0)=0, fib(1)=1
return fibonacci(n - 1) + fibonacci(n - 2);
}
console.log(fibonacci(7)); // 13
// Sum of array using recursion
function sumArray(arr) {
if (arr.length === 0) return 0; // Base case
return arr[0] + sumArray(arr.slice(1)); // Recursive case
}
console.log(sumArray([1, 2, 3, 4, 5])); // 15
// Countdown example
function countdown(n) {
if (n <= 0) {
console.log("Blast off!");
return;
}
console.log(n);
countdown(n - 1);
}
countdown(3); // 3, 2, 1, "Blast off!"
// Nested object traversal
function findValue(obj, key) {
if (obj[key]) return obj[key];
for (const k in obj) {
if (typeof obj[k] === 'object') {
const result = findValue(obj[k], key);
if (result) return result;
}
}
return null;
}Puntos Clave
- ✓Resuelve un problema llamando a una función dentro de sí misma.
- ✓Practica con ejemplos de código reales para solidificar tu comprensión
- ✓Este concepto construye la base para temas más avanzados
Recursos de Aprendizaje Relacionados
Continúa tu camino de programación con estos tutoriales relacionados: