我有一个关于我所做的递归函数的问题。有一种方法,一旦我到达"返回arraydenodes"我就可以完全退出一个函数。线?因为我跟踪了Visual Studio的代码执行,一旦执行到达上面提到的行,它就会返回到堆栈(或者我相信)直接进入" else"来自while循环。因此,path.Add
行不断执行,给我一个不同的结果。这是代码。
private Node[] checkTheOtherDude(Node start, Node endpadre, Node end, Node previousNodeTemp)
{
//Debug.Log(previousNode);
while(endpadre != null && !stop)
{
if (!Physics.Linecast(end.transform.position, endpadre.transform.position)) // end y endpadre se ven?
{
previousNode = endpadre;
Node newParent = endpadre.padre;
checkTheOtherDude(start, newParent, end, previousNode); // chequear n y n padre padre
}
else
{
//previousNode = endpadre;
path.Add(end);
path.Add(previousNode);
end = endpadre;
Node newParent = end.padre;
checkTheOtherDude(start, newParent, endpadre, previousNode);
}
}
stop = true;
path.Add(end);
path.Add(start);
path.Reverse();
arraydeNodes = path.ToArray();
return arraydeNodes;
}
似乎我已经解决了问题,问题(或者至少我认为)是while条件,将其更改为while (endpadre != null && !stop && endpadre != start)
我错过了endpadre != start
以便循环结束当结束节点与起始节点相同时。
答案 0 :(得分:0)
是的,只需更改这两行
即可checkTheOtherDude(start, newParent, end, previousNode);
checkTheOtherDude(start, newParent, endpadre, previousNode);
到
return checkTheOtherDude(start, newParent, end, previousNode);
return checkTheOtherDude(start, newParent, endpadre, previousNode);
这些将使它一直向上返回
答案 1 :(得分:0)
在while循环之后执行的代码是否可以执行多次(与递归级别一样多)?
同时path.Reverse()
将被多次调用,这是我不确定你真正想要的东西。
为防止代码执行,您可以执行以下操作:
if (!stop)
{
stop = true;
path.Add(end);
path.Add(start);
path.Reverse();
arraydeNodes = path.ToArray();
}
return arraydeNodes;
我玩了一下,我修改了你的代码。
试试这个:
private Node[] checkTheOtherDude(Node start, Node endpadre, Node end, Node previousNodeTemp)
{
if (endpadre == null)
{
path.Add(end);
path.Add(start);
path.Reverse();
arraydeNodes = path.ToArray();
return arraydeNodes;
}
else if (!Physics.Linecast(end.transform.position, endpadre.transform.position)) // end y endpadre se ven?
{
previousNode = endpadre;
Node newParent = endpadre.padre;
return checkTheOtherDude(start, newParent, end, previousNode); // chequear n y n padre padre
}
else
{
//previousNode = endpadre;
path.Add(end);
path.Add(previousNode);
end = endpadre;
Node newParent = end.padre;
return checkTheOtherDude(start, newParent, endpadre, previousNode);
}
}
尝试使用测试数据(仅少数节点)运行此操作。然后在第一次单击后检查路径,然后调试第二次单击。你应该能够看到问题点。也许存在无限递归(节点括号中的循环)