Cualquier función recursiva se puede hacer para iterar (en un bucle) pero necesita usar una pila para mantener el estado.
Normalmente, la recursión de cola es fácil de convertir en un bucle:
A(x) {
if x<0 return 0;
return something(x) + A(x-1)
}
se puede traducir en:
A(x) {
temp = 0;
for i in 0..x {
temp = temp + something(i);
}
return temp;
}
Otros tipos de recursividad que se pueden traducir en la recursión de cola también son fáciles de cambio. El otro requiere más trabajo.
la siguiente:
treeSum(tree) {
if tree=nil then 0
else tree.value + treeSum(tree.left) + treeSum(tree.right);
}
no es tan fácil de traducir. Puede eliminar una parte de la recursión, pero la otra no es posible sin una estructura para mantener el estado.
treeSum(tree) {
walk = tree;
temp = 0;
while walk != nil {
temp = temp + walk.value + treeSum(walk.right);
walk = walk.left;
}
}
Sospecho que realmente quiere decir que no puede ser reescrito sin algún tipo de pila, ¿verdad? – AnthonyWJones
Realmente no. Quiero decir si es totalmente imposible reescribirlo usando un bucle. Estoy pensando en la recursión indirecta como un ejemplo. –
https://secweb.cs.odu.edu/~zeil/cs361/website/Website/Lectures/recursionConversion/page/recursionConversion.html – user1709408