for循环的递归函数:返回值问题

时间:2014-07-13 21:13:22

标签: c++ xml tinyxml

我正在尝试编写的这个递归xml遍历函数确实正确访问每个节点/元素/标记,并且它在测试期间确实传递了基本情况if语句。它不做的是在函数完成展开后保持正确的返回节点。由于某些原因,主程序移动到下一行时,我的结果总是为NULL。我是递归的新手,所以希望这是一个简单的错误..

TiXmlNode* findNode(TiXmlNode* startNode, const char* searchWord){ 

    if (strcmp(startNode->Value(), searchWord) == 0){// base case
        return startNode;
    }
    else
    {
        for (TiXmlNode* node = startNode->FirstChild(); node; node = node->NextSibling())
        {
            findNode(node, searchWord);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

考虑最深findNode次调用何时返回startNode。它去哪儿了?好吧,它是从这里打来的:

findNode(node, searchWord);

你对这个结果做了什么?没有!你忽略了它。你需要return一直向下堆叠。

或者从另一方面考虑它。第一次调用findNode,如果它没有进入第一个if块,将永远不会达到return语句。它永远不会有return你想要的机会。

以下是我的写作方式:

TiXmlNode* findNode(TiXmlNode* startNode, const char* searchWord){ 

    if (strcmp(startNode->Value(), searchWord) == 0){// base case
        return startNode;
    }

    for (TiXmlNode* node = startNode->FirstChild(); node; node = node->NextSibling())
    {
        TiXmlNode* foundNode = findNode(node, searchWord);
        if (foundNode != NULL) {
            return foundNode;
        }
    }

    return nullptr;
}