Recursión
Una función puede, en su definición, llamarse a sí misma. Esto no ahorra memoria (hay múltiples copias de variables), por lo que hay que tener cuidado de no realizar una recursión demasiado grande, o sin salida, ya que de hacerlo, esta multiplicación de las variables automáticas de la función haría que el programa corra fuera del stack, atacando otras regiones del programa, y produciendo que el proceso "reviente".
Hay problemas que son más naturalmente tratados a través de la recursión. En muchos casos, esto no quiere decir eficiencia, pero si compacidad y "elegancia" del código; pero en otros casos, se obtienen soluciones tanto elegantes como eficientes a un problema dado.
Generalmente en un problema que se define en forma recursiva hay una solución trivial y otra que se define en base al problema mismo. En la implementación de una función recursiva también, habrá una solución trivial y una solución recursiva.
Por ejemplo, el problema del cálculo del factorial de un número se define como:
0! = 1 Solución Trivial n! = n * (n-1)! Solución recursiva
Ejemplo:
ejem_recursion.c
/* calculo del factorial usando recursión */
#include <stdio.h>
double Factorial(int N);
main()
{
int i;
for(i = 1; i < 10; i++)
printf("%d!=%f\n", Factorial(i);
}
double Factorial(int N)
{
if(N == 0) /* Solución Trivial */
return 1;
return N * Factorial(N-1); /* Solución Recursiva */
}
Puntos a Notar
- Cada instancia de ejecución de la función Factorial tiene sus propias variables internas (cada instancia tiene una variable N propia).
- En este caso se dará el caso que hay múltiples instancias de la función factorial corriendo simultáneamente, pero debido a que cada una tiene sus propias variables internas, estas no interfieren entre si.