【问题标题】:Recursion -> Iteration递归 -> 迭代
【发布时间】:2012-10-17 16:54:09
【问题描述】:

使用以下 Trie 结构:

struct Trie{
    char letter;
    bool eow;
    Trie *letters[26];
};

我正在使用以下代码按字母顺序将单词从 trie 提取到向量中。

void getWords(const TrieNode& data, vector<string> &words, string acc)
{
  if (data.eow)
    words.push_back(acc);

  for (int i = 0; i < 26; i++) {
    if (data.letters[i] != NULL)
      getWords(*(data.letters[i]), words, acc + data.letters[i]->letter);
  }
}

我只是想知道是否有一种方法可以不使用递归而只使用迭代?我正在尝试仅通过迭代来实现这一点,但想不出一种方法来检查树中每一层的每个字母,使用循环。有什么建议吗?

【问题讨论】:

  • 如果问题真的只是“有没有办法在不递归的情况下做到这一点?”那么是的,当然。如果你问“我该怎么做?”那么简短的回答是使用堆栈。
  • 可以添加语言标签吗?例如cc++
  • 您至少可以发布一个希望编译的结构定义。
  • 抱歉,编辑了问题

标签: c++ algorithm recursion iteration


【解决方案1】:
struct State {
  const TrieNode* data;
  string acc;
  int index;
  State( ... ): ... {} // element-wise constructor, left as an exercise
};

std::vector<string> getWords( const TrieNode* root )
{
  std::vector<string> retval;
  std::vector<State> states;
  states.push_back( State( root, string(), 0 ) );
  while (!states.empty())
  {
    State s = states.back();
    states.pop_back();
    if (s.data->eow)
    {
      retval.push_back( s.acc );
      continue;
    }
    if (s.index >= 26)
      continue;
    states.push_back( State( s.data, s.acc, s.index+1 ) );
    if (s.letters[s.index])
    {
      states.push_back( State( s.letters[s.index], s.acc + s.letters[s.index]->letter, 0 ) );
    }
  }
  return std::move(retval);
};

状态是一个显式堆栈,它跟踪的数据几乎与您递归跟踪的数据相同。我想我设法以与您的递归函数相同的顺序访问元素,但这并不重要。

注意上面的代码是写出来的,没有经过测试,你必须为State写一个元素构造函数,因为我很懒。

【讨论】:

  • 有没有办法像循环中的循环一样做到这一点?或者你建议我创建一个 State 类/结构
  • 我建议你做一个明确的堆栈。您可以在堆栈中包含更少的细节,您甚至可以使用您的 acc 字符串作为堆栈来完成。我不会推荐它。
猜你喜欢
  • 2019-12-10
  • 2011-11-14
  • 1970-01-01
  • 2012-04-26
  • 2012-01-23
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多