递归到迭代,保留变量和调用顺序

Recursion to iteration preserving variables and order of calls

本文关键字:调用 顺序 变量 保留 迭代 递归      更新时间:2023-10-16

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

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循环中设置断点。