What is wrong with my Java recursive function?

时间:2016-07-11 22:39:28

标签: java recursion

I'm trying to write a relatively straightforward recursive program in Java to compute all the possible ways to traverse a 4x4 matrix (not necessarily traveling through every spot), starting at the top left and ending in the bottom right spaces. I use a 2-D array to do this, marking off visited spaces with "1"s as I go.

It's been a while since I've worked recursively and I can't seem to get the output I expect. The output from the code below is "2" - obviously, the result should be much higher. I know there's something tiny I'm overlooking. Can someone tell me what it is?

public static void main(String[] args) {
    int[][] matrix = new int[4][4];
    int result = moveRobot(matrix, 0, 0);
    System.out.print(result + "");
}

public static int moveRobot(int[][] matrix, int x, int y) {
    if (x == 3 && y == 3) {
        return 1;
    } else if (x < 0 || y < 0 || x > 3 || y > 3) {
        return 0;
    } else if (matrix[x][y] == 1) {
        return 0;
    } else {
        matrix[x][y] = 1;
        return moveRobot(matrix, x, y+1) + moveRobot(matrix, x+1, y) + moveRobot(matrix, x, y-1) +
                moveRobot(matrix, x-1, y);
    }
}

1 个答案:

答案 0 :(得分:1)

The problem is that the matrix is not copied but passed by value of the reference to it. Every time you modify it such in matrix[x][y] = 1 other successive code paths will see the modification instead that working on an unmodified state.

For example here:

moveRobot(matrix, x, y+1) + moveRobot(matrix, x+1, y)

Entering the first call will modify matrix, so in second moveRobot call you'd end up with 1 in matrix[x][y+1] while that's not what you want.