La récursivité itérative de la queue est généralement implémentée en utilisant Tail calls. Il s'agit essentiellement d'une transformation d'un appel récursif en une simple boucle.
C# exemple:
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);
};
à
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);
};
ou mieux encore:
uint Factorial(uint n) {
uint accum = 1;
start:
if(n < 2) return accum;
accum *= n;
n -= 1;
goto start;
};
C# pas vrai récursion de queue, c'est parce que la valeur de retour est modifiée , la plupart des compilateurs ne briseront pas ce faire wn dans une boucle:
int Power(int number, uint power) {
if(power == 0) return 1;
if(power == 1) return number;
return number * Power(number, --power);
}
à
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;
}
Votre première fonction n'est pas la queue récursive , donc ce ne sera pas, mais transformé en itération à Erlang. – Jules
Vous avez fondamentalement raison, mais un bon compilateur devrait être capable de voir la structure. Je vais modifier mon exemple plus tard. – Dykam
+ Notez que les deux dernières actions avant le retour sont directement dérivées de l'appel de fin. – Dykam