简单的递归算法机制

时间:2012-12-08 03:36:46

标签: java recursion

一旦实例化并调用方法遍历(0,0),它将自动解决迷宫,其中7表示路径,3表示“尝试路径”。 我正在尝试理解这段代码,但我仍然陷入了遍历方法中的 first else语句。

public class Maze
{
    private final int TRIED = 3;
    private final int PATH = 7;
    private int[][] grid = { {1,1,1,0,1,1,0,0,0,1,1,1,1},
                             {1,0,1,1,1,0,1,1,1,1,0,0,1},
                             {0,0,0,0,1,0,1,0,1,0,1,0,0},
                             {1,1,1,0,1,1,1,0,1,0,1,1,1},
                             {1,0,1,0,0,0,0,1,1,1,0,0,1},
                             {1,0,1,1,1,1,1,1,0,1,1,1,1},
                             {1,0,0,0,0,0,0,0,0,0,0,0,0},
                             {1,1,1,1,1,1,1,1,1,1,1,1,1} };

public boolean traverse (int row, int column)
{
    boolean done = false;
    if (valid (row, column))
    {
       grid[row][column] = TRIED;
       // this cell has been tried
       if (row == grid.length-1 && column == grid[0].length-1)
          done = true;
          // the maze is solved
       else
       {
          done = traverse (row+1, column); 
          // down
          if (!done)
          done = traverse (row, column+1); 
          // right
          if (!done)
          done = traverse (row-1, column);
          // up

          if (!done)
          done = traverse (row, column-1);
          // left
       }
    if (done)
    // this location is part of the final path
    grid[row][column] = PATH;
    }
    return done;
}

//-----------------------------------------------------------------
//  Determines if a specific location is valid.
//-----------------------------------------------------------------
private boolean valid (int row, int column)
{
    boolean result = false;
    // check if cell is in the bounds of the matrix
    if (row >= 0 && row < grid.length && column >= 0 &&
       column < grid[row].length)
       // check if cell is not blocked and not previously tried
       if (grid[row][column] == 1)
       result = true;
       return result;
}

据我所知,

done = traverse (row+1, column); 

这一行是一个递归调用并将其向下移动一次,并将再次运行该方法,但如果它无效呢?整个方法不停止吗?我不明白某个地点无效后控制流程在哪里转移。

例如,如果[1] [0]无效,控制是否会切换回[0] [0]调用并处理“正确”语句? if(!done)的意思在哪里和什么意思,我的意思是当迷宫完全解决时只做等于true,如果有效,完成将等于true,那么整个事情不会停止吗?

3 个答案:

答案 0 :(得分:2)

这是你的方法:

public boolean traverse (int row, int column)
{
    boolean done = false;
    if (valid (row, column))
    {
       ...
    }
    return done;
}

因此,如果该点无效,它将跳过所有测试并返回false

答案 1 :(得分:0)

如果有效测试失败,则执行的下一步是“返回完成”;在方法的最后,它将返回false。这会将有关失败的信息传递给调用者。

答案 2 :(得分:0)

在第一个检查行和列的有效性。如果行和列无效,则该方法不会立即停止,因为基于完成字段的值,将执行第一个else中的嵌套if块。