【问题标题】:StackOverflow error due to recursion in Java由于 Java 中的递归导致的 StackOverflow 错误
【发布时间】:2015-06-13 00:28:38
【问题描述】:

我正在尝试使用递归方法来解决由 Java 中的 1 和 0 组成的 int 数组表示的迷宫。 wasHere[] 检查该方法是否已经解析了特定的坐标集,correctPath[] 记录迷宫的答案路径;它们都被初始化,每个索引都为假。

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;
   }
}

过去几个小时我一直被这个错误困扰,任何帮助将不胜感激。

【问题讨论】:

  • 粘贴您的完整代码。
  • 可能没有bug。你的迷宫有多大?堆栈是有限的,所以每个堆栈都有一个足够大的迷宫来溢出它。
  • @BarryFruitman 我的测试迷宫是 300x400。我最好也处理 2000x2000 的文件

标签: java recursion stack-overflow maze


【解决方案1】:

我认为没有这样的错误(不是我能看到的),但你递归的方式太多导致了这个问题。我不确定你在程序中输入了什么值,但我能够注意到使用这些参数初始化上述程序的问题:

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); 

【讨论】:

  • 我按照您的建议将运行参数设置为 -Xss258m,然后设置为 -Xss2580m,但它们都不起作用:/。我的阵列大约是 300x400,这很奇怪,因为 258 兆字节适用于您的 1000x1000 阵列。感谢您的意见。
  • 你能展示一下你是怎么做的吗?如果它对我有用,它必须对你有用。还请打印“java -version”并将其粘贴到此处。
  • 这是我跑的方式:../jdk1.6.0_38/bin/java -Xss218m mazeSolver
  • i.imgur.com/ruHroYN.png - 这就是我设置参数的方式(IDE 称为 jGrasp)。以下是输出:java 版本“1.8.0_40”Java(TM) SE 运行时环境(构建 1.8.0_40-b26)Java HotSpot(TM) 客户端 VM(构建 25.40-b25,混合模式,共享)
  • 我不是 jGrasp 专家,但快速下载并试用表明 jGrasp 正在以这种方式设置参数:java mazeSolver -Xss218m。这是行不通的。要测试我推荐的内容,请尝试使用命令行方法。转到命令行,使用参数执行 java,就像我向您展示的那样。如果 jGrasp 无法为 Java 程序设置运行时堆栈大小......我宁愿使用 Eclipse,它有非常简单的方法来为程序设置 JVM 参数......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 2014-04-17
相关资源
最近更新 更多