gpt4 book ai didi

c++ - 如何解决由递归函数引起的堆栈溢出错误? C++

转载 作者:行者123 更新时间:2023-12-01 15:13:00 24 4
gpt4 key购买 nike

如标题所示,我认为递归函数导致程序堆栈溢出。并且需要递归逻辑,该如何解决?

码:

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个顶点的斯坦福兔子时,它溢出了。然后我将 堆栈的大小反转为,增大为 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);
}

正如一些程序员dude所指出的那样,代码实际上是无操作的(断言除外,但我假设这只是调试细节,而不是代码的重点)。因此,除非有其他事情发生,否则您可以将其完全删除。

细节很重要。

关于c++ - 如何解决由递归函数引起的堆栈溢出错误? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61997002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com