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

  1. Cada instancia de ejecución de la función Factorial tiene sus propias variables internas (cada instancia tiene una variable N propia).
  2. 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.

ICOM