【发布时间】:2020-09-11 18:31:58
【问题描述】:
如标题所示,我认为递归函数导致我的程序堆栈溢出。而且需要递归逻辑,如何解决?
代码:
static bool orient_flip_face(HE *edge)
{
if(edge->flip == NULL)
return 1;
return orient_face(face);
}
static bool orient_face(HEF *face)
{
assert(face->oriented);
return orient_flip_face(face->edge);
}
static bool build_HE(he::Mesh_Data *mesh,
std::vector<HEV*> *hevs,
std::vector<HEF*> *hefs)
{
// process mesh data
// ...
return orient_face(first_face);
}
基本上 orient_face 和 orient_flip_face 来回调用对方,直到它是最后一个顶点。当我通过一个简单的网格时很好,但是当我通过具有 63690 个顶点的 stanford rabbit 时,它会溢出。然后我将 stack reversed size 增加到 40MB 并修复了堆栈溢出错误。但这是一个合理的解决方案吗?
谢谢!
【问题讨论】:
-
请出示代码。没有代码我们只能猜测,这可能对你没有帮助。
-
对不起!现在添加它
-
您可以尝试将其转换为循环。
-
重要的区别是无限递归和大但仍然有限的递归。无限回溯实际上是一个逻辑错误。但是,如果递归是有限的,则可以对其进行优化。
-
至于问题的可能原因,你记得初始化你的结构吗?此外,您在“列表”中将多少个对象链接在一起?最后,您显示的代码不是正确的minimal reproducible example,尤其是考虑到它包含不相关的错误(在
orient_flip_face函数中,face是什么?)
标签: c++ recursion graphics stack-overflow