c ++递归调用不将项目推送到向量

时间:2012-02-24 14:38:27

标签: c++ recursion vector

几天前,我问了一个非常类似的问题,我要问的是关于递归的问题。以下是旧问题的链接:C++ vector loses data in recursive function

我现在感觉非常密集,因为我认为我理解在递归调用中尝试推送向量的问题,但我现在遇到类似功能的问题。 以下是该函数的代码:

void TriangleDynamic::collectRayRecursive(Ray &ray, double binSize, double radius, Point &org)
{   
    if (getLowestLevel())
    {
        //this is where I push the ray. 
        raysPushBack(move(ray));
    }

    else
    {
        bool foundIntersectSub = false;
        unsigned int ctr = 0;
        while((!foundIntersectSub) && (ctr<=getSubTrianglesSize() - 1 ))
        {
            if (getSubTriangle(ctr).intersect(ray) )
            {
                foundIntersectSub = true;
                getSubTriangle(ctr).collectRayRecursive(ray, binSize, radius, org);

            }
            ctr = ctr + 1;
        }
    }

}

该函数是TriangleDynamic类的一部分,并将Ray作为参数。已知Ray与TriangleDynamic对象相交,但如果三角形不是“最低级别”三角形,则该函数会查看三角形的子三角形,以查找哪个subTriangle也已经与Ray相交(一个将与设计相交) 。这是递归调用发生的地方,只有达到最低级别三角形才会将光线推送到称为光线的矢量并且是TriangleDynamic的成员数据。但我再一次失去了数据。有没有办法做到这一点?我无法相信我之前的问题得到了多快而轻松的回答,我想我会再试一次!谢谢!

1 个答案:

答案 0 :(得分:2)

getSubTriangle(ctr).collectRayRecursive(ray, binSize, radius, org);

您的向量位于TriangleDynamic [如您所说],但您的递归调用每次都在TriangleDynamic的不同实例上工作,因此第一次递归调用的vector与第二个递归调用的向量不同,它与第三个递归调用不同.... [好吧,我不能确定它真的因为我需要更多的代码,但我假设如此]

您必须确保在递归调用后,将vector生成的getSubTriangle()复制到this

编辑:查看递归调用的“堆栈跟踪”:
调用堆栈可能看起来像这样:

|triangle_1.collectRayRecursive()|
---------------------------------

通过调用递归调用,您会[注意triangle_1,triangle_2是不同的对象]

|triangle_2.collectRayRecursive()|
|triangle_1.collectRayRecursive()|
---------------------------------

等等:......

|triangle_n.collectRayRecursive()|
....
|triangle_2.collectRayRecursive()|
|triangle_1.collectRayRecursive()|
---------------------------------

现在,您修改了对象vector [最深的递归调用]内的triangle_n,而不是其他三角形中的vector
当你从递归中返回时,弹出头部triangle_n - 而不复制vector
因此 - 新信息未添加到triangle_(n-1)中的向量中,该向量不会将其传递给triangle_(n-2) ...这不会将其传递给triangle_1 - 你希望看到最终结果的地方。