Java 方法在返回语句后不退出

Java 方法在返回语句后不退出,java,Java,我有一个方法,我已经写了递归解决一个迷宫 该方法使用printMaze()打印正确的输出,但返回的值不正确。我尝试运行调试器,由于某种原因,即使在输入结束条件:if(x==g_x&&y==g_y)(目标已找到,因此打印并返回它)后,该方法仍继续运行。进入结束条件后,它会打印,但不会停止 private static int[][] solver(int x, int y, int s_x, int s_y, int g_y, int g_x, int[][] maze, int[][] visi

我有一个方法,我已经写了递归解决一个迷宫

该方法使用
printMaze()
打印正确的输出,但返回的值不正确。我尝试运行调试器,由于某种原因,即使在输入结束条件:
if(x==g_x&&y==g_y)
(目标已找到,因此打印并返回它)后,该方法仍继续运行。进入结束条件后,它会打印,但不会停止

private static int[][] solver(int x, int y, int s_x, int s_y, int g_y, int g_x, int[][] maze, int[][] visited) {
        if (x == g_x && y == g_y) {
            solved = true;
            visited = printMaze(visited, g_x, g_y, s_x, s_y);
            return visited;
        }
        visited[x][y] = 1;
        if (isValid(x+1, y, maze) && isSafe(maze, visited, x+1, y)) {
            solution = solver (x+1, y, s_x, s_y, g_x, g_y, maze, visited);
        }
        if (isValid(x, y+1, maze) && isSafe(maze, visited, x, y+1)) {
            solution = solver (x, y+1, s_x, s_y, g_x, g_y, maze, visited);
        }
        if (isValid(x-1, y, maze) && isSafe(maze, visited, x-1, y)) {
            solution = solver (x-1, y, s_x, s_y, g_x, g_y, maze, visited);
        }
        if (isValid(x, y-1, maze) && isSafe(maze, visited, x, y-1)) {
            solution = solver (x, y-1, s_x, s_y, g_x, g_y, maze, visited);
        }
        visited[x][y] = 0;
        if (!solved) {
            return null;
        } else {
            return visited;
        }

    }
助手方法:

private static int[][] printMaze(int[][] solution, int g_x, int g_y, int s_x, int s_y) {
        solution[g_x][g_y] = 1;
        solution[s_x][s_y] = 1;
        for (int i = 0; i < solution.length; i++) {
            for (int j = 0; j < solution[0].length; j++) {
                    System.out.print(" " + solution[i][j]); 
            }
            System.out.println();
        }
        System.out.println("////");
        return solution;
    }

    private static boolean isSafe (int[][] maze, int[][] visited, int x, int y) {
        return !(maze[x][y] == 1 || visited[x][y] == 1);
    }

    private static boolean isValid (int x, int y, int[][] maze) {
        return (x >= 0 && x < maze.length && y >= 0 && y < maze[0].length);
    }
溶液打印(正确)

返回的解决方案(不正确)

  • 虽然可以使用带有[x][y]的数组,但更常见的是使用[cols][rows],即[y][x]
  • 您的方法参数在
    、int g_y、int g_x、
    中的位置错误
  • printMaze
    的输出与返回的数组非常不同,因为在本例中,没有递归调用返回。您正在打印数组,但之后所有递归都返回,继续(并创建更多的递归),然后调用
    visted[x][y]=0然后再次返回。这几乎完全抹去了您访问的
    阵列

  • 你分析过调用堆栈了吗?该方法是递归的,因此当达到终端状态时,递归必须展开。我确实理解了,但我不完全理解它(由于对不同java库的大量调用),但我不明白为什么递归在到达end if语句(带有return语句的语句)后继续进行。因为返回可能返回到调用端,这很可能是一个递归调用。我也看不出有问题。我的main方法调用solver一次,打印它返回的任何内容(不正确的数组),就是这样。因为你没有检查递归调用的返回值,你继续检查当前位置的其他边,即使前面的边已经提供了解决方案。当您要
    solution=solver(x+1,y,s_x,s_y,g_x,g_y,maze,已访问)时
    ,如果(solution!=null)返回解决方案,则需要检查
    哦!这很有意义,我如何修复递归部分?
    
    {0, 0, 0, 0},
    {1, 1, 0, 0},
    {0, 0, 0, 1},
    {0, 0, 1, 0}
    
    {1, 1, 1, 0},
    {0, 0, 1, 0},
    {1, 1, 1, 0},
    {1, 1, 0, 0}
    
    1 0 1 0
    0 0 0 0
    1 0 0 0
    0 0 0 0