几天前,我问了一个与我将要问的关于递归的问题非常相似的问题。这是旧问题的链接:C++ vector loses data in recursive function
我现在感觉很紧张,因为我认为我理解在递归调用中尝试推送到 vector 的问题,但我现在遇到类似功能的问题。 下面是该函数的一些代码:
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 对象相交,但如果三角形不是“最低级别”三角形,则该函数会查看三角形 subTriangles 以查找哪个 subTriangle 也与 Ray 相交(一个将被设计相交) .这是递归调用发生的地方,只有到达最低级别的三角形时,才会将射线推到称为射线的 vector ,该 vector 是 TriangleDynamic 的成员数据。但是我又一次丢失了数据。有什么办法吗?我不敢相信我之前的问题得到了这么快和这么容易的回答,我想我会再试一次!谢谢!
最佳答案
getSubTriangle(ctr).collectRayRecursive(ray, binSize, radius, org);
你的 vector 存在于 TriangleDynamic
[正如你所说],但是你的递归调用每次都在 TriangleDynamic
的不同实例上工作,所以 vector
第一次递归调用的 vector 与第二次递归调用的 vector 不同,后者与第三次递归调用不同.... [好吧,我真的不能确定,因为我需要更多代码,但我认为是这样]。
您必须确保在递归调用之后,将位于 getSubTriangle()
生成的三角形中的 vector
复制到 this
.
编辑:查看递归调用的“堆栈跟踪”:
调用堆栈可能看起来像这样:
|triangle_1.collectRayRecursive()|
---------------------------------
通过递归调用你得到[注意 triangle_1, triangle_2 是不同的对象]
|triangle_2.collectRayRecursive()|
|triangle_1.collectRayRecursive()|
---------------------------------
等等:...
|triangle_n.collectRayRecursive()|
....
|triangle_2.collectRayRecursive()|
|triangle_1.collectRayRecursive()|
---------------------------------
现在,您修改位于对象 triangle_n
[最深的递归调用] 中的 vector
,但不修改另一个中的 vector
三角形。
当你从递归中返回时,弹出头部,即triangle_n
- 没有复制vector
。
因此 - 新信息没有添加到 triangle_(n-1)
中的 vector ,它不会传递给 triangle_(n-2)
... 不会将其传递给 triangle_1
- 您希望在其中看到最终结果。
关于c++递归调用不将项目推送到 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9432499/