【问题标题】:Returning a value from a recursive function从递归函数返回一个值
【发布时间】:2013-07-27 08:59:33
【问题描述】:

另一个递归问题,抱歉,我无法解决这个问题。我试图返回一个节点指针,其 id 与提供的 id 匹配。我想我正在正确地遍历树。有什么想法我在这里出错了吗?

//h
Node* findNode(const QString &id, Node *node=NULL)

//cpp
Node* Tree::findNode(const QString &id, Node *node)
{
    if (node == NULL)
        node = root;

    for(int i = 0, end = node ? node->childCount() : -1; i < end ; i++)
    {
        QString nodeId = node->child(i)->id();

        if (nodeId == id)
        {
            return node;
        }
        else
        {
            return findNode(id, node->child(i));
        }
    }
}

感谢观看

【问题讨论】:

    标签: c++ recursion tree


    【解决方案1】:

    else 中,仅在找到某些内容时才返回递归调用的值。否则,您将永远无法通过i=0

    【讨论】:

      【解决方案2】:

      我很确定你需要类似的东西:

       ...
       else
       {
           Node *temp = findNode(id, node->child(i));
           if (temp) return temp;
       }
      

      事实上,它会在循环结束之前返回。

      另外,您需要在函数结束时返回 NULL(或者更好的是 nullptr):

      // At the end
      return NULL;
      

      【讨论】:

      • 谢谢大家。 Mats,在 else 子句中,节点 id 与所需的 id 不匹配,那么为什么我需要返回节点?
      • return temp; 是替换return findNode(...) - 这意味着您在子节点中找到了您要查找的内容。显然,如果temp 为NULL,则需要继续查找。在您的原始代码中,您总是在此时返回,因此您从未查看特定级别的所有节点 - 这显然是错误的。但是如果你发现了什么,你不想继续寻找,所以如果你找到了,就回来。
      【解决方案3】:
      else return findNode(id, node->child(i));`
      

      这将导致仅遍历第一个子树(子树)。

      我宁愿写这样的东西,以便按顺序遍历所有子树,直到找到东西。如果没有找到,返回nullptr

      Node *find(Node *tree, string id)
      {
          if (tree->id == id)
              return tree;
      
          Node *ptr = nullptr;
          for (int i = 0; i < tree->childCount; i++)
              if ((ptr = find(node->children[i], id)) != nullptr)
                  return ptr;
      
          return nullptr;
      }
      

      【讨论】:

        【解决方案4】:

        您似乎只进行深度优先搜索,并返回最左侧叶节点的结果。

        在 findNode(id, node->child(i));你永远不会检查这是否返回 NULL。

        只有在子元素的返回值不为 NULL 时才从那里返回(你实际上找到了一些东西),否则,继续循环(现在,你只看第一个元素)。

        然后,在循环之后,如果没有找到任何东西(还没有返回),则返回 NULL。

        【讨论】:

          猜你喜欢
          • 2014-05-01
          • 2012-10-16
          • 2021-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-07
          • 2016-03-23
          • 1970-01-01
          相关资源
          最近更新 更多