首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >迷宫生成给我一个堆栈溢出错误

迷宫生成给我一个堆栈溢出错误
EN

Stack Overflow用户
提问于 2019-05-24 12:11:17
回答 1查看 45关注 0票数 0

在我的迷宫生成代码中,我得到了一个堆栈溢出错误,为什么?我该如何修复它?它只在末尾发生。如果我注释掉else语句中的一个If语句,代码就能正常工作。为什么会这样呢?我试图递归地生成一个迷宫,但我不确定我做得是否正确

代码语言:javascript
运行
复制
    public void generate(int row, int col) {

        rng = new Random();
        int move = rng.nextInt(4);

        if(hasUnvisited()==false) {
            System.out.println("e");
        }

        else if(move==0&&row+2<=19) {
            if (maze[row+2][col].getVisited()==false) {
                maze[row+1][col].remove();
            }
            maze[row][col].visit();
            generate(row+2,col);
        }
        else if(move==1&&row-2>=0) {
            if (maze[row-2][col].getVisited()==false) {
                maze[row-1][col].remove();
            }
            maze[row][col].visit();
            generate(row-2,col);
        }
        else if(move==2&&col+2<=19) {
            if (maze[row][col+2].getVisited()==false) {
                maze[row][col+1].remove();
            }
            maze[row][col].visit();
            generate(row,col+2);
        }
        else if(move==3&&col-2>=0) {
            if (maze[row][col-2].getVisited()==false) {
                maze[row][col-1].remove();
            }
            maze[row][col].visit();
            generate(row,col-2);
        }

        else {
            maze[row][col].visit();
            if (move==0) {
                generate(row-2,col);
            }

            else if (move==1) {
                generate(row+2,col);
            }

            else if (move==2) {
                generate(row,col-2);
            }

            else if (move==3) {
                generate(row,col+2);
            }
        }       
    }

Exception in thread "main" java.lang.StackOverflowError
    at java.util.Random.<init>(Unknown Source)
    at Maze.generate(Maze.java:41)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:94)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:94)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:88)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:88)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:88)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:94)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:94)
    at Maze.generate(Maze.java:88)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:88)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:67)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:74)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:60)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:53)
    at Maze.generate(Maze.java:67)
EN

回答 1

Stack Overflow用户

发布于 2019-05-24 14:24:11

您的堆栈在告诉您两件事时非常冗长:

  • 你实际上有一个堆栈溢出,它不是由忘记的索引增量或诸如此类的东西引起的。
  • 代码不会(从外观上看)陷入无限循环,因为堆栈帧在代码中的不同行处终止。如果它不同,你就会有一个无限的循环。它可能仍然是一个(被看似随机隐藏的),但它的可能性要小得多。

目前,无论何时进行递归调用(在generate中调用generate ),都会增加堆栈的大小。您将所有当前字段状态传递到一个堆栈帧中,VM必须记住这一点,同时继续generate的下一个较低层调用。因为这可能还会调用自身,以此类推,在某些时候,堆栈会变得太大而无法存储在堆栈上。

在我看来,你有两个选择。要么在启动VM set JAVA_OPTS=%JAVA_OPTS% -Xms1024m -Xmx1024m时增加最大堆栈大小,要么(更好的选择)重写代码以进行迭代。这样,您就不会无限期地增加堆栈。这意味着什么:

而不是递归地工作(调用方法本身),您必须创建循环,通过显式设计访问不同级别的堆栈。所有的递归代码(在IT理论中)都可以转换为迭代代码,因此这应该是可能的。然而,你必须以不同的方式思考。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56285780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档