Jede rekursive Funktion kann zur Iteration (in eine Schleife) gemacht werden, aber Sie müssen einen Stack selbst verwenden, um den Status beizubehalten.
Normalerweise Endrekursion ist einfach in eine Schleife zu konvertieren:
A(x) {
if x<0 return 0;
return something(x) + A(x-1)
}
in übersetzt werden kann:
A(x) {
temp = 0;
for i in 0..x {
temp = temp + something(i);
}
return temp;
}
Andere Arten von Rekursion, die in Endrekursion übersetzt werden können, sind auch leicht zu Veränderung. Die anderen erfordern mehr Arbeit.
wie folgt zusammen:
treeSum(tree) {
if tree=nil then 0
else tree.value + treeSum(tree.left) + treeSum(tree.right);
}
Ist das nicht leicht zu übersetzen. Sie können ein Teil der Rekursion entfernen, aber das andere ist nicht ohne eine Struktur möglich, um den Zustand zu halten.
treeSum(tree) {
walk = tree;
temp = 0;
while walk != nil {
temp = temp + walk.value + treeSum(walk.right);
walk = walk.left;
}
}
Ich vermute, du meinst eigentlich, was nicht ohne irgendeine Form von Stapel neu geschrieben werden kann, ist das so? – AnthonyWJones
Eigentlich nein. Ich meine, wenn es total unmöglich ist, es mit einer Schleife neu zu schreiben. Ich denke an indirekte Rekursion als Beispiel. –
https://secweb.cs.odu.edu/~zeil/cs361/web/website/Lectures/recursionConversion/page/recursionConversion.html – user1709408