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);
}
溶液打印(正确)
返回的解决方案(不正确)
、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