你可以做到这一点通过模拟调用堆栈:
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;
}
作为练习:改变迭代如此作为堆栈条目的一部分,您可以存储您当前正在迭代的集合(从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;
}
因为它是你的程序将进入无限循环(如果你使用递归或迭代无关紧要)。首先确定逻辑。 – ElKamina 2013-04-22 15:32:58
它不会陷入无限循环。它适用于较小的边界。问题是边界太大。 – DoubleBass 2013-04-22 15:36:33
请显示'getItems'的简化版本。它如何依赖于'p'? – 2013-04-22 15:48:45