0

执行此递归时收到 stackoverflow 错误。有一种模式,它首先说一次:

在 MazeGui.move(MazeGui.java:79) 这是行 if(rigting.goal == true) {

然后它说以下两个,并且它们都在输出中重复了很长时间。问题发生在某个地方,我只是不确定是什么:

在 MazeGui.move(MazeGui.java:89)这是行 move(rigting.right, pos); //向右移动

在 MazeGui.move(MazeGui.java:107)这是行 move(rigting.left, pos); //向左移动

...

...

我错过了终止条件或其他什么,是否发生了一些无限递归?我无法将我的头包裹起来,完全迷失了。任何帮助,将不胜感激。

编码:

public boolean move(Maze rigting, int pos)
{
    if (rigting.goal == true)
    {
        return true;
    }
    if (rigting.wallR != true)
    {
        pos += 1;
        move(rigting.right, pos); //moves right

        showLabel(pos);
        return true;
    }
    if(rigting.wallD != true) //checks if there is a wall below
    {
        pos += 10;
        move(rigting.down, pos); //moves down

        showLabel(pos);
        return true;
     }
     if(rigting.wallL != true) //checks if there is a wall on the left
     {
        pos -= 1;
        move(rigting.left, pos); //moves left

        showLabel(pos);
        return true;
     }
     if(rigting.wallU != true) //checks if there is a wall above
     {
        pos -= 10;
        move(rigting.up, pos); //moves up

        showLabel(pos);
        return true;
     }

     return false;
}
4

2 回答 2

1

您的“路径”算法有一个简单的递归循环。

在这种情况下,您的算法计算出您必须向右移动。然后,一旦你这样做了,它就会计算出你必须向左移动。一旦你向左移动,你就回到了上次的位置。由于你回到了起始位置,循环重新开始,并以这种方式无限地继续(或者,真的,直到堆栈溢出)。

一个可能的解决方案是分析您的应用程序的状态,并在状态更新的任何时候检测您之前是否处于该状态;如果是,请相应地修改您的行为。

于 2012-09-30T22:52:28.643 回答
0

你可能想尝试这样的事情,

public boolean move(Maze rigting, int pos)

{
    if (rigting.goal == true)
    {
         return true;
    }

    if (rigting.wallR != true)
    {
         pos += 1;
         showLabel(pos);
         return move(rigting.right, pos); //moves right
    }

    if(rigting.wallD != true) //checks if there is a wall below
    {
        pos += 10;
        showLabel(pos);
        return move(rigting.down, pos); //moves down
    }
    if(rigting.wallL != true) //checks if there is a wall on the left
    {
        pos -= 1;
        showLabel(pos);
        return move(rigting.left, pos); //moves left
    }

    if(rigting.wallU != true) //checks if there is a wall above
    {
        pos -= 10;
        showLabel(pos);
        return move(rigting.up, pos); //moves up
    }

    return false;
}
于 2012-09-30T22:49:50.813 回答