如何修复由递归函数引起的堆栈溢出错误? 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_faceorient_flip_face互相调用直到它是最后一个顶点。当我通过一个简单的网格时很好,但是当我通过具有 63690 个顶点的斯坦福兔子时,它是 overflowed.Then 我增加了 stack reversed size40MB 并修复了堆栈溢出错误。但这是一个合理的解决方案吗?

谢谢!

您可能 运行 陷入巨大的递归甚至无限递归循环。尝试检查您的基本情况并验证递归是否在有限限制内停止。

您的代码是尾递归的示例,因为递归调用是每个函数中执行的最后一件事。尾递归很容易转化为非递归循环。以下代码等同于您拥有的代码,并且根本不使用递归。

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);
}

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

细节很重要。