Historia de la pregunta:
La recursión ha sido soportada en C desde su aparición; se integra naturalmente en la paradigma del lenguaje, permitiendo construir soluciones compactas, especialmente para problemas que involucran árboles, listas y algoritmos complejos de descomposición.
Problema:
Los principales riesgos de usar recursión son el consumo excesivo de la pila, la posibilidad de desbordamiento de la pila (stack overflow) y el impacto en el rendimiento (en comparación con la implementación cíclica). En C no hay una forma estándar de controlar automáticamente la profundidad de la anidación de llamadas.
Solución:
Antes de aplicar la recursión, evaluar el nivel máximo posible de anidación, usar la recursión de cola si es posible (para optimización del compilador) y agregar protecciones contra desbordamiento, como un contador explícito de profundidad de recursión. Un método alternativo es reemplazar las llamadas recursivas por ciclos para problemas simples.
Ejemplo de código:
#include <stdio.h> #define MAX_DEPTH 1000 int factorial(int n, int depth) { if (depth > MAX_DEPTH) { printf("Error: se ha superado la profundidad máxima de recursión!\n"); return -1; } if (n == 0) return 1; return n * factorial(n - 1, depth + 1); } int main() { printf("%d\n", factorial(5, 0)); // 120 return 0; }
Características clave:
¿Se limpiará la pila si se ejecuta un return dentro de la función recursiva antes de que finalicen todas las llamadas?
Sí, la pila se libera al salir de la función actual. No quedará ningún dato "colgante" en la pila si no hubo desbordamiento.
¿Se pueden declarar variables locales estáticas dentro del cuerpo de una función recursiva, y cómo se comportarán?
Sí. Dichas variables serán compartidas entre todas las llamadas recursivas, su valor se mantendrá entre llamadas, lo que a menudo lleva a errores si no se tiene en cuenta este comportamiento.
¿Influye el compilador C en la profundidad de la recursión y es capaz de limitarla?
El compilador no limita directamente la recursión. La profundidad de la recursión está limitada por el tamaño de la pila del sistema operativo o por factores externos.
Se implementó un recorrido recursivo de un árbol de búsqueda sin limitar la profundidad:
Pros:
Contras:
En la versión mejorada se introdujo un contador de profundidad y un cambio a un recorrido basado en pila en tamaños grandes de árbol:
Pros:
Contras: