如何跳出一些深度递归的函数并直接返回结果

How can i jump out some deeply recursed function and return the result directly

本文关键字:返回 结果 函数 何跳出 深度 递归      更新时间:2023-10-16

这有点像是在搜索什么。为了让代码读起来更清楚,我把这个函数写成了递归函数。但问题是,当达到目标时,我想结束那些深度递归函数,并将结果直接返回给父函数。(那个调用这个函数的)我知道你可以使用return。但返回似乎只能把你带到外部函数,而外部函数离出口和返回结果还有很长的路要走。任何人都知道我该怎么做。谢谢

更新:我想遍历一个二叉树来搜索一个特定的节点。它是用C++编写的,并以递归方式完成。所以当工作完成后,我想直接跳出来并返回节点指针,而不是逐层返回到外部递归。我怎么能呢?这里没有粘贴任何代码,因为我甚至不知道如何编码,谢谢。

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

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

考虑一下:

// 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
    }
}

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

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

执行递归调用树是一项成本高昂的操作的原因是因为树的宽度,而不是高度。高度为对数时,宽度呈指数增长。

这意味着您可以很容易地使用return返回从叶子到根的路径。例如,假设您在到达第1000000个呼叫时找到结果。将结果检索回顶部的返回链将仅为log2(1000000)~=20个调用。

您可以毫不犹豫地使用某种全局数据结构来"更快"地检索结果,但这是一个非常无关紧要的更快的解决方案,可能不是最优雅和可读的解决方案。