完全退出递归函数

时间:2017-02-10 14:43:55

标签: c# recursion unity3d while-loop

我有一个关于我所做的递归函数的问题。有一种方法,一旦我到达"返回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以便循环结束当结束节点与起始节点相同时。

2 个答案:

答案 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);
    }                   
}

尝试使用测试数据(仅少数节点)运行此操作。然后在第一次单击后检查路径,然后调试第二次单击。你应该能够看到问题点。也许存在无限递归(节点括号中的循环)