执行递归时的Stackoverflow

时间:2012-09-30 22:42:32

标签: java recursion stack-overflow

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

  

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

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

  

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

     

在MazeGui.move(MazeGui.java:107)这是行移动(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;
}

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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;
}