Recursión

Está permitido llamar a la misma función desde sentencias dentro de una función. Este tipo de llamadas se denominan recursivas.

Volvamos al ejemplo del cálculo de los números de Fibonacci. Siguiendo la fórmula para calcular cada número como la suma de los dos anteriores (excepto los dos primeros, que son iguales a 1), es fácil escribir una función recursiva para calcular los números de Fibonacci.

int Fibo(const int n)
{
   if(n <= 1return 1;
   
   return Fibo(n - 1) + Fibo(n - 2);
}

Una función recursiva debe ser capaz de devolver el control sin recursión, como en nuestro caso dentro de la sentencia condicional if para los índices 0 y 1. De lo contrario, la secuencia de llamadas a funciones podría continuar indefinidamente. En la práctica, dado que las llamadas a funciones no finalizadas se acumulan en una zona limitada de la memoria denominada pila (véase la sección Sentencias de declaración y definición y la barra lateral «Montón» y «Pila» en la sección Descripción de arrays), tarde o temprano la función terminará con el error en tiempo de ejecución «Stack overflow» (desbordamiento de pila). Este problema se muestra en la función FiboEndless.

int FiboEndless(const int n)
{
   return FiboEndless(n - 1) + FiboEndless(n - 2);
}

Tenga en cuenta que este no es un error de compilación. En tal caso, el compilador ni siquiera generará un aviso (aunque, técnicamente, podría hacerlo). El error se produce durante la ejecución del script. Se imprimirá en el diario Experts del terminal.

La recursión puede producirse no sólo cuando se llama a una función desde la propia función. Por ejemplo, si la función F llama a la función G que, a su vez, llama a la función F, este caso es una recursión indirecta. Así, la recursión puede producirse como resultado de llamadas cíclicas de cualquier profundidad.