La recurrencia de cola iterativa se implementa generalmente utilizando Tail calls. Esto es básicamente una transformación de una llamada recursiva a un bucle simple.
ejemplo de C#:
uint FactorialAccum(uint n, uint accum) {
if(n < 2) return accum;
return FactorialAccum(n - 1, n * accum);
};
uint Factorial(uint n) {
return FactorialAccum(n, 1);
};
a
uint FactorialAccum(uint n, uint accum) {
start:
if(n < 2) return accum;
accum *= n;
n -= 1;
goto start;
};
uint Factorial(uint n) {
return FactorialAccum(n, 1);
};
o incluso mejor:
uint Factorial(uint n) {
uint accum = 1;
start:
if(n < 2) return accum;
accum *= n;
n -= 1;
goto start;
};
C no # real de la recursión de cola, esto se debe a que se modifique el valor de retorno , la mayoría de los compiladores no romperán esto wn en un bucle:
int Power(int number, uint power) {
if(power == 0) return 1;
if(power == 1) return number;
return number * Power(number, --power);
}
a
int Power(int number, uint power) {
int result = number;
start:
if(power == 0) return 1;
if(power == 1) return number;
result *= number;
power--;
goto start;
}
Su primera función no es la cola recursiva , por lo que esto no se convertirá en iteración en Erlang. – Jules
Básicamente tienes razón, pero un buen compilador debería ser capaz de ver la estructura. Voy a modificar mi ejemplo más tarde. – Dykam
+ Tenga en cuenta que las dos últimas acciones antes del salto atrás se derivan directamente de la llamada final. – Dykam