Любая рекурсивная функция может быть сделана для итерации (в цикл), но вам нужно использовать стек самостоятельно, чтобы сохранить состояние.
Обычно хвостовую рекурсию легко преобразовать в цикл:
A(x) {
if x<0 return 0;
return something(x) + A(x-1)
}
Можно перевести на:
A(x) {
temp = 0;
for i in 0..x {
temp = temp + something(i);
}
return temp;
}
Другие виды рекурсии, которые можно перевести в хвостовую рекурсию, также легко изменить. Другие требуют больше работы.
Следующее:
treeSum(tree) {
if tree=nil then 0
else tree.value + treeSum(tree.left) + treeSum(tree.right);
}
Не так просто перевести. Вы можете удалить одну часть рекурсии, но другую невозможно без структуры для хранения состояния.
treeSum(tree) {
walk = tree;
temp = 0;
while walk != nil {
temp = temp + walk.value + treeSum(walk.right);
walk = walk.left;
}
}