您可以通过模拟调用堆栈来做到这一点:
struct stackentry {
int x;
Item item; // see exercise for reader, below
};
func F(int x, int y, array p){
dynamic_list_of_stackentry mystack;
start:
p[x] = 1;
if (x<=y){
for each item in getItems(x,p){
mystack.push(stackentry(x, item));
x = item
goto start
resume:
x = mystack.top().x;
item = mystack.top().item;
mystack.pop();
}
}
if mystack.size() > 0:
goto resume
return p;
}
留作练习:更改迭代,以便您可以将当前迭代的集合 (from getItems()
) 和您在其中的当前位置存储为堆栈条目的一部分。
我并不是说这是优雅的代码,但是您可以从与递归函数相同的非递归函数的这个起点进行重构。例如,您的下一步可能是:
func F(int x, int y, array p){
dynamic_list_of_int mystack;
mystack.push(x)
while not mystack.empty() {
x = mystack.top();
mystack.pop();
p[x] = 1;
if (x <= y) {
for each item in reversed(getItems(x,p)) {
mystack.push(item);
}
}
}
return p;
}