我有一个非常复杂的代码来从递归转换为迭代。我不知道如何使用这种代码来做到这一点:
read(std::queue<int>& rules, std::queue<double>& data)
{
int r = rules.top();
rules.pop();
switch(r)
{
case 1:
{
double a = data.front(); data.pop();
read(rules, data);
double b = data.front(); data.pop();
read(rules, data);
double c = a + b;
data.push(c);
}
break;
case 2:
{
read(rules, data);
data.pop();
}
break;
case 3:
{
data.push(0.0);
}
}
}
在这种情况下我不知道如何开始......
最佳答案
标准方法是使用显式堆栈作为局部变量来模拟递归堆栈。
struct Task {
int caseValue; /* 1, 2, 3 */
std::queue<int>& rules;
std::queue<double>& data;
void execute(std::stack<Task>& agenda)
{ // do one thing and put next tasks in the agenda
// by using agenda.push_back
}
};
typedef std::stack<Task> Agenda;
void read(...) {
Agenda agenda;
int r = rules.top();
rules.pop();
agenda.push_back(Task(r, rules, data));
while (!agenda.empty()) {
Task task = agenda.top();
agenda.pop_back();
task.execute(agenda);
};
}
这里的议程模拟了你的递归堆栈。迭代版本可能效率较低,但可以简化调试,因为您可以在 while 循环中设置断点。
关于c++ - 递归到迭代保留变量和调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39103705/