如何修复由递归函数引起的堆栈溢出错误? C++
How to fix a stack overflow error caused by recursive functions? C++
如标题所示,我认为递归函数导致我的程序堆栈溢出。并且需要递归逻辑,如何解决?
代码:
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 个顶点的斯坦福兔子时,它是 overflowed.Then 我增加了 stack reversed size 到 40MB 并修复了堆栈溢出错误。但这是一个合理的解决方案吗?
谢谢!
您可能 运行 陷入巨大的递归甚至无限递归循环。尝试检查您的基本情况并验证递归是否在有限限制内停止。
您的代码是尾递归的示例,因为递归调用是每个函数中执行的最后一件事。尾递归很容易转化为非递归循环。以下代码等同于您拥有的代码,并且根本不使用递归。
static bool orient_face(HEF *face)
{
for (;;)
{
assert(face->oriented);
HE *edge = face->edge;
if (edge->flip == NULL)
return 1;
}
}
static bool build_HE(he::Mesh_Data *mesh,
std::vector<HEV*> *hevs,
std::vector<HEF*> *hefs)
{
// process mesh data
// ...
return orient_face(first_face);
}
正如一些程序员指出的那样,该代码实际上是一个空操作(断言除外,但我假设这只是一个调试细节,而不是代码的重点)。所以除非有其他事情发生,否则你可以完全删除它。
细节很重要。
如标题所示,我认为递归函数导致我的程序堆栈溢出。并且需要递归逻辑,如何解决?
代码:
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 个顶点的斯坦福兔子时,它是 overflowed.Then 我增加了 stack reversed size 到 40MB 并修复了堆栈溢出错误。但这是一个合理的解决方案吗?
谢谢!
您可能 运行 陷入巨大的递归甚至无限递归循环。尝试检查您的基本情况并验证递归是否在有限限制内停止。
您的代码是尾递归的示例,因为递归调用是每个函数中执行的最后一件事。尾递归很容易转化为非递归循环。以下代码等同于您拥有的代码,并且根本不使用递归。
static bool orient_face(HEF *face)
{
for (;;)
{
assert(face->oriented);
HE *edge = face->edge;
if (edge->flip == NULL)
return 1;
}
}
static bool build_HE(he::Mesh_Data *mesh,
std::vector<HEV*> *hevs,
std::vector<HEF*> *hefs)
{
// process mesh data
// ...
return orient_face(first_face);
}
正如一些程序员指出的那样,该代码实际上是一个空操作(断言除外,但我假设这只是一个调试细节,而不是代码的重点)。所以除非有其他事情发生,否则你可以完全删除它。
细节很重要。