c++ - 递归到迭代保留变量和调用顺序

标签 c++ recursion iteration

我有一个非常复杂的代码来从递归转换为迭代。我不知道如何使用这种代码来做到这一点:

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/

相关文章:

c++ - 是否有 GCC pragma 来打开和关闭 C++11?

c++ - 如何在子对话框中获取 wxFrame 指针

c++ - SDL 不显示形状

c++ - 来自 http://www.cplusplus.com 的 std::packaged_task::reset 示例不起作用

algorithm - 使用深度优先搜索的三角形最大和

python递归pascal三角形

java - 为什么不能将 LinkedList 的最后一个节点设置为 null?

javascript - 如何映射任意 Iterables?

python - 以 3 为一组打印 python 列表

algorithm - 关于内存使用的递归与迭代