如何跳出一些深度递归的函数并直接返回结果
How can i jump out some deeply recursed function and return the result directly
这有点像是在搜索什么。为了让代码读起来更清楚,我把这个函数写成了递归函数。但问题是,当达到目标时,我想结束那些深度递归函数,并将结果直接返回给父函数。(那个调用这个函数的)我知道你可以使用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个调用。
您可以毫不犹豫地使用某种全局数据结构来"更快"地检索结果,但这是一个非常无关紧要的更快的解决方案,可能不是最优雅和可读的解决方案。
- C++Brute Force攻击函数不会返回结果
- 如何在一个表达式中生成并返回结果?
- 使用std::tie进行类似golang的错误处理,同时返回结果,是否有缺点?(C++11)
- C++ 线程端回调并返回结果
- C++使用存储过程返回结果
- reinterpret_cast总是返回结果C++?
- 尝试以随机字符(长读取)打印字符串返回结果
- 通过C 中的参考返回结果
- 使用枚举确定返回结果的类型(使用宏的黑客)
- 返回结果不可见
- 打开一个 Shell 程序,向其传递参数,然后返回结果
- 如何在递归函数中计算返回结果
- 整数列表的交集-无法返回结果列表
- 来自 open() 的返回结果代码之间的差异:25 与 3
- 使用 c++11 线程返回结果的正确方法是什么
- 传递StringBuilder并从c++dll向c#返回结果
- 如何跳出一些深度递归的函数并直接返回结果
- 使用MPI临时接收数据,然后返回结果
- C++,我不知道为什么我的函数不返回结果
- QDialog show()后面跟着返回结果操作