我怎么能跳出一些深度递归的函数并直接返回结果

时间:2014-10-18 09:40:44

标签: c++ recursion

这有点像搜索某些东西。为了使代码更清晰,我将函数写为递归函数。但问题是当达到目标时我想结束那些深度递归的函数并将结果直接返回给父函数。(一个叫做这个函数)我知道你可以使用return。但似乎返回只能带你到外部函数,这仍然太远,无法到达出口并返回结果。谁知道我该怎么做。感谢

更新:我想遍历二叉树以搜索特定节点。它是用C ++编写的,并以递归方式完成。因此,当作业完成时,我想直接跳出并返回节点指针,而不是逐层返回外部递归。我该怎么办?这里没有粘贴任何代码,因为我甚至无法弄清楚如何编码,谢谢。

第二次更新:也许我没有说清楚。为此道歉。我的意思是,有时你只知道树中只有一个节点匹配,当到达该节点时,你只想将结果返回给调用函数而不需要更多的递归。我只是想知道是否有一些技巧可以绕过C ++执行机制并简单地结束所有递归。否则你必须一步一步地返回,直到堆栈为空。谢谢。

3 个答案:

答案 0 :(得分:1)

如果您的递归定义开头是正确的,那么一切都会正常工作。

考虑一下:

// Just an example to demonstrate recursion:

#include <vector>
#include <iostream>

int Size(std::vector<int> const &v)
{
    if (v.empty())
    {
        // size of empty vector = 0
        return 0;
    }
    else
    {
        // size of non-empty vector = 1 + size of sub-vector
        // starting from 2nd element:
        return 1 + Size(std::vector<int>(v.begin() + 1, v.end()));
    }
}

int main()
{
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    std::cout << Size(v) << "\n"; // prints 3
}

也许您真正需要的是一种处理特殊错误情况的方法,在这种情况下您无法正常返回。在这种情况下,我经常发现例外是务实的解决方案。

int RecursiveFunction(int arg)
{
    // ...

    return RecursiveFunction(/* ... */);

    // ...

    // special error:
    throw std::runtime_error("special error");
}

void StartRecursiveFunction()
{
    try
    {
        int i = RecursiveFunction(start);
    }
    catch (std::runtime_error const &exc)
    {
        // error
    }
}

当然,您不应滥用异常来返回正常程序流中的值。

答案 1 :(得分:0)

例如,当您到达所需节点时,您可以返回bool true,否则返回bool false。然后,在横向代码中,检查在搜索下一个子节点之前是否成功搜索每个子节点。如果是,您可以再次返回true,依此类推。没有搜索到额外的节点。

答案 2 :(得分:0)

执行递归调用树的原因是如此昂贵的操作是因为树的宽度而不是高度。在高度为对数的情况下,宽度呈指数增长。

这意味着您可以非常轻松地使用返回返回从叶子到根的路径。例如,假设您在达到第1000000次通话时找到结果。将结果检索回顶部的返回链只是log2(1000000)〜= 20次调用。

你仍然可以使用某种全局数据结构来检索结果&#34;更快&#34;但是它更快,并且可能不是最优雅和可读的解决方案。