【问题标题】:Stack overflow error with recursion递归堆栈溢出错误
【发布时间】:2014-08-27 04:13:15
【问题描述】:

我目前正在 Unity 中开发一款游戏,我决定使用深度优先搜索来生成迷宫。这涉及递归,可怕的野兽,即使我似乎已经正确设置了递归,我仍然不断收到堆栈溢出错误。查了好久,好像没找到错误。

代码如下:

private void MazeDigger(int[,] maze, int r, int c){

    int[] directions = new int[] {1, 2, 3, 4};
    Shuffle(directions);

    for(int i = 0; i < directions.Length; i++){

        switch(directions[i]){
        case 1:

            if(r-2 <= 0)
            {
                continue;
            }

            if(maze[r-2, c] != 0)
            {
                maze[r-2, c] = 2;
                maze[r-1, c] = 2;
                MazeDigger(maze, r-2, c);
            }
            break;

        case 2:

            if(c+2 >= MazeWidth - 1)
            {
                continue;
            }

            if(maze[r, c+2] != 0)
            {
                maze[r, c+2] = 2;
                maze[r, c+1] = 2;
                MazeDigger(maze, r, c+1);
            }
            break;

        case 3:

            if(r+2 >= MazeHeight - 1)
            {
                continue;
            }

            if(maze[r+2, c] != 0)
            {
                maze[r+2, c] = 2;
                maze[r+1, c] = 2;
                MazeDigger(maze, r+2, c);
            }
            break;

        case 4:

            if(c-2 <= 0)
            {
                continue;
            }

            if(maze[r, c-2] != 0)
            {
                maze[r, c-2] = 2;
                maze[r, c-1] = 2;
                MazeDigger(maze, r, c-2);
            }
            break;
        }
    }
}

真的很简单。我创建了一个具有四个方向的数组,我随机打乱它们,然后使用 for 循环遍历数组。里面有一个 switch 语句,它基本上将迷宫中的不同点标记为 = 2。这是因为代码的不同部分使用模数在这些位置生成立方体。任何帮助将不胜感激,如果我没有提供足够的信息,请告诉我谢谢!

【问题讨论】:

  • 即兴表演,听起来它只是执行了很多次,以至于堆栈中的内存不足。一些调试技巧可能包括在崩溃之前输出正在执行的迭代次数。也许退出条件没有像你期望的那样工作,它实际上是无限循环的?我认为,确认退出条件正常工作至少是一个不错的起点。
  • 好吧,所以我假设它是无限循环的,因为我测试了一个 5x5 的迷宫,它非常小,但它并没有生成它。我刚刚测试了一个 3x3 迷宫,但它可以工作。我能生成的最高值是 4x4。这应该适用于 100x100 和更大的迷宫。我通常不会在这台机器上遇到任何堆栈问题。怎么这么容易溢出来?
  • 主题太元了! :)

标签: c# recursion unity3d stack-overflow


【解决方案1】:

没有退出条件或者你搞砸了检查。

你用2标记每个访问过的单元格,但如果它不等于0,你将再次访问它。永无止境的故事:)

3x3 迷宫有效,因为每个单元格都未通过边界检查并且不会发生递归。 4x4 迷宫应该已经失败,但它可能适用于某些起始条件。

【讨论】:

  • 你是对的,尽管出于某种原因,4x4 总是对我有用。我通过更改 if 语句的条件来解决这个问题。谢谢!
猜你喜欢
  • 2018-03-10
  • 2016-11-11
  • 2015-06-17
  • 1970-01-01
  • 2012-08-20
  • 2016-12-30
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多