如何修复递归函数导致的堆栈溢出错误?C++

如何修复递归函数导致的堆栈溢出错误?C++,c++,recursion,graphics,stack-overflow,C++,Recursion,Graphics,Stack Overflow,如标题所示,我认为递归函数导致程序堆栈溢出。需要递归逻辑,如何修复 代码: 基本上,orient_face和orient_flip_face来回调用,直到最后一个顶点。当我通过一个简单的网格时,这很好,但是当我通过stanford rabbit(有63690个顶点)时,它溢出了。然后我将堆栈反向大小增加到40MB,它修复了堆栈溢出错误。但这是一个合理的解决方案吗 谢谢大家! 您可能遇到了巨大的递归循环,甚至是无限递归循环。尝试检查基本情况,并验证递归是否在有限限制内停止。您可能遇到了巨大的递归甚

如标题所示,我认为递归函数导致程序堆栈溢出。需要递归逻辑,如何修复

代码:

基本上,orient_face和orient_flip_face来回调用,直到最后一个顶点。当我通过一个简单的网格时,这很好,但是当我通过stanford rabbit(有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);
}
正如一些程序员指出的那样,代码实际上是一个除断言之外的无操作,但我假设这只是一个调试细节,而不是代码的要点。因此,除非有其他事情发生,否则你可以完全删除它


细节很重要。

您的代码是尾部递归的一个示例,因为递归调用是每个函数中执行的最后一件事。尾部递归很容易转换为非递归循环。下面的代码与您拥有的代码等效,根本不使用递归

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);
}
正如一些程序员指出的那样,代码实际上是一个除断言之外的无操作,但我假设这只是一个调试细节,而不是代码的要点。因此,除非有其他事情发生,否则你可以完全删除它



细节很重要。

请显示代码。没有代码,我们只能猜测,这可能帮不了你。对不起!现在添加它可以尝试将其转换为循环。重要的区别在于infinte递归和大型但仍然有限的递归之间的区别。无限重复实际上是一种逻辑错误。但是,如果递归是有限的,则可能会对其进行优化。至于问题的可能原因,您是否记得初始化您的结构?另外,在列表中有多少个对象链接在一起?最后,您显示的代码不是正确的,特别是考虑到它在orient_flip_face函数中包含不相关的错误,什么是face?请显示代码。没有代码,我们只能猜测,这可能帮不了你。对不起!现在添加它可以尝试将其转换为循环。重要的区别在于infinte递归和大型但仍然有限的递归之间的区别。无限重复实际上是一种逻辑错误。但是,如果递归是有限的,则可能会对其进行优化。至于问题的可能原因,您是否记得初始化您的结构?另外,在列表中有多少个对象链接在一起?最后,您显示的代码不是正确的,特别是考虑到它在orient_flip_face函数中包含不相关的错误,face是什么?谢谢!基本案例有效!当有63690个电话时它崩溃了。你能在你的问题中添加更多细节吗。如果不知道更多细节,很难提供帮助。当然!刚刚加上!谢谢基本案例有效!当有63690个电话时它崩溃了。你能在你的问题中添加更多细节吗。如果不知道更多细节,很难提供帮助。当然!刚刚加上!哇,我解决了你的建议,使用while循环来代替递归!谢谢你,约翰!!哇,我解决了你的建议,使用while循环来代替递归!谢谢你,约翰!!