【问题标题】:Recursion to iteration preserving variables and order of calls递归到迭代保留变量和调用顺序
【发布时间】:2016-08-23 14:16:03
【问题描述】:

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

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);
    }
  }
}

我不知道如何在这种情况下开始......

【问题讨论】:

标签: c++ recursion iteration


【解决方案1】:

标准方法是使用显式堆栈作为局部变量来模拟递归堆栈。

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

【讨论】:

    猜你喜欢
    • 2021-03-04
    • 2012-11-17
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2018-10-16
    • 2018-06-19
    相关资源
    最近更新 更多