几天前,我问了一个非常类似的问题,我要问的是关于递归的问题。以下是旧问题的链接: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的成员数据。但我再一次失去了数据。有没有办法做到这一点?我无法相信我之前的问题得到了多快而轻松的回答,我想我会再试一次!谢谢!
答案 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
- 你希望看到最终结果的地方。