Java中的递归导致堆栈溢出错误
我尝试使用递归方法来解决Java中由1和0组成的int数组表示的迷宫。wasHere[]检查方法是否已解析该特定坐标集,correctPath[]记录迷宫的答案路径;它们都是初始化的,每个索引都是falseJava中的递归导致堆栈溢出错误,java,recursion,stack-overflow,maze,Java,Recursion,Stack Overflow,Maze,我尝试使用递归方法来解决Java中由1和0组成的int数组表示的迷宫。wasHere[]检查方法是否已解析该特定坐标集,correctPath[]记录迷宫的答案路径;它们都是初始化的,每个索引都是false import java.awt.Point; class mazeSolver{ int[][] maze; int startX, startY; int endX, endY; int width, height; boolean[][] was
import java.awt.Point;
class mazeSolver{
int[][] maze;
int startX, startY;
int endX, endY;
int width, height;
boolean[][] wasHere, correctPath;
mazeSolver(int[][] m, int sX,int sY,int nX,int nY){
maze = m;
width = maze[0].length;
height = maze.length;
startX = sX;
startY = sY;
endX = nX;
endY = nY;
System.out.println("Height: " + height + "\t Width: " + width);
correctPath = new boolean[height][width];
wasHere = new boolean[height][width];
for (int row = 0; row < maze.length; row++)
for (int col = 0; col < maze[row].length; col++){
wasHere[row][col] = false;
correctPath[row][col] = false;
}
solveMaze(startX,startY);
}
public boolean solveMaze(int x, int y){
boolean solvable = recursiveSolve(x,y);
return solvable;
}
private boolean recursiveSolve(int x, int y){ //1s are walls, 0s are free space
if (x == endX && y == endY)
return true;
if (wasHere[y][x] || maze[y][x] == 1)
return false;
wasHere[y][x] = true;
if (y < height-1){
if (solveMaze(x,y+1))
return true;
}
if (y > 0){
if (solveMaze(x,y-1))
return true;
}
if (x > 0){
if (solveMaze(x-1,y))
return true;
}
if (x < width-1){
if (solveMaze(x+1,y))
return true;
}
return false;
}
public int[][] getSolvedMaze(){
for(int y = 0; y < height; y++)
for (int x = 0; x< width; x++)
if(correctPath[y][x])
maze[y][x] = 2;
return maze;
}
}
导入java.awt.Point;
mazeSolver类{
int[][]迷宫;
int startX,startY;
int endX,endY;
int宽度、高度;
布尔[][]wasHere,正确路径;
mazeSolver(int[][]m,int-sX,int-sY,int-nX,int-nY){
迷宫=m;
宽度=迷宫[0]。长度;
高度=迷宫长度;
startX=sX;
startY=sY;
endX=nX;
endY=nY;
System.out.println(“高度:“+Height+”\t宽度:“+Width”);
correctPath=新布尔值[高度][宽度];
wasHere=新布尔值[高度][宽度];
对于(int row=0;row0){
if(x,y-1))
返回true;
}
如果(x>0){
if(x-1,y))
返回true;
}
if(x
在过去的几个小时里,我一直被这个错误困扰着,如果能得到任何帮助,我将不胜感激。我认为没有这样的错误(我看不出来),但您的递归太多,导致了这个问题。我不确定您将哪些值输入到程序中,但我能够注意到使用以下参数初始化上述程序的问题:
mazeSolver MazeSolver = new mazeSolver(new int [100][100], 0, 0, 100,100);
因此,为了按原样运行程序,我增加了堆栈大小。您可以在运行程序时向JVM提供以下参数:-Xss258m
此堆栈大小能够容纳1000大小的阵列。我没有太多时间来测试其他尺寸
mazeSolver MazeSolver = new mazeSolver(new int [1000][1000], 0, 0, 1000,1000);
粘贴完整的代码。可能没有bug。你的迷宫有多大?堆栈是有限的,所以每个堆栈都有一个足够大的迷宫来溢出它。@BarryFruitman我的测试迷宫是300x400。我更愿意处理2000x2000的参数,尽管我也按照您的建议将run参数设置为-Xss258m,然后设置为-Xss2580m,但它们都不起作用:/。我的阵列大约是300x400,这是奇怪的,因为258兆字节用于1000x1000阵列。谢谢你的意见。你能告诉我你是怎么做的吗?如果它对我有效,它对你也有效。请打印“java-version”并粘贴到这里。下面是我运行的方式:../jdk1.6.0_38/bin/java-Xss218m mazeSolver-这就是我设置参数的方式(IDE称为jGrasp)。以下是输出:java版本“1.8.0_40”java(TM)SE运行时环境(build 1.8.0_40-b26)java HotSpot(TM)客户端VM(build 25.40-b25,混合模式,共享)我不是jGrasp专家,但快速下载并试用表明jGrasp以这种方式设置参数:java mazeSolver-XS218M。这是行不通的。要测试我的建议,请尝试命令行方法。转到命令行,使用参数执行java,就像我向您展示的那样。如果jGrasp不能为Java程序设置运行时堆栈大小…我宁愿使用Eclipse,它有一种非常简单的方法来为程序设置JVM参数。。。