递归到迭代,保留变量和调用顺序
Recursion to iteration preserving variables and order of calls
我有一个非常复杂的代码要从递归转换到迭代。我不知道如何使用这种代码:
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循环中设置断点。
相关文章:
- 以 f() + g() 调用顺序的 C++ 函数
- 如何创建跟踪以显示存在递归的调用顺序
- 析构函数的奇怪调用顺序
- 输入法管理器函数 - 平假名到汉字候选列表 c++ covnersion 的正确调用顺序
- 构造函数的调用顺序
- 模板func和非模板func调用顺序
- C++对返回*this的成员函数的重复调用顺序
- 在C++中,析构函数的调用顺序和成员变量的销毁顺序是什么
- XSetWMProtocols 和 glXCreateContext 在多线程环境中调用顺序
- __attribute__((构造函数)) 调用顺序混淆
- 此代码是否依赖于函数调用顺序未定义的行为
- 如何强制实施析构函数的调用顺序
- C++在递归函数中平衡了树/调用顺序
- 构造调用顺序(C++)
- 无法理解析构函数调用顺序
- 构造函数调用顺序与组合
- 构造函数/析构函数在堆栈上的调用顺序
- 递归到迭代,保留变量和调用顺序
- Qt队列连接中的插槽调用顺序
- visual studio-C++函数调用顺序(boost)-混乱