Il semble que personne n'a pris en compte lorsqu'le récursive de la fonction s'appelle elle-même plus d'une fois dans le corps, et les poignées de revenir à un point spécifique de la récursivité (c'est à dire n'est pas primitive récursive). Il est dit que chaque récursion peut être transformé en itération, de sorte qu'il semble que ce devrait être possible.
Je suis juste venu avec un exemple en C# de comment faire cela. Supposons que vous disposez de la fonction récursive, qui agit comme un postorder de la traversée, et que AbcTreeNode est un 3-ary arbre avec des pointeurs a, b, c.
public static void AbcRecursiveTraversal(this AbcTreeNode x, List<int> list) {
if (x != null) {
AbcRecursiveTraversal(x.a, list);
AbcRecursiveTraversal(x.b, list);
AbcRecursiveTraversal(x.c, list);
list.Add(x.key);//finally visit root
}
}
La solution itérative:
int? address = null;
AbcTreeNode x = null;
x = root;
address = A;
stack.Push(x);
stack.Push(null)
while (stack.Count > 0) {
bool @return = x == null;
if (@return == false) {
switch (address) {
case A://
stack.Push(x);
stack.Push(B);
x = x.a;
address = A;
break;
case B:
stack.Push(x);
stack.Push(C);
x = x.b;
address = A;
break;
case C:
stack.Push(x);
stack.Push(null);
x = x.c;
address = A;
break;
case null:
list_iterative.Add(x.key);
@return = true;
break;
}
}
if (@return == true) {
address = (int?)stack.Pop();
x = (AbcTreeNode)stack.Pop();
}
}