一旦满足基本情况,如何使此递归方法停止?

时间:2018-09-29 20:07:33

标签: c# recursion

我必须使用递归来解决一个迷宫。迷宫必须在找到开放路径的地方放置一个X(我的代码会这样做)。它必须这样做,直到使用递归调用到达出口为止(我的代码执行此操作,除了下面所述的)。它也必须 在到达死角的地方放置一个O,将Os拉回到“适当”的路径,然后继续沿新路径求解(我的代码执行此操作)。

如何,一旦到达迷宫的尽头,就必须解决一个新的迷宫(原始迷宫,转置后的迷宫)。我的问题如下:

一旦到达迷宫的尽头,我会收到IndexOutOfBoundsException。这是预期的;我无法继续在迷宫界之外进行测试!就是说,如果我尝试以任何方式测试并避免异常,则递归方法调用仍在调用堆栈上,结果是我的方法一直将Os一直写回到起点。 >

我想在退出时简单地中止或退出。我以为我的基本情况可以解决这个问题,但事实并非如此。它一直在继续。从那时起,我无法执行 any 返回,包括通过基本案例进行测试或在方向检查期间进行测试,因为返回会造成一种情况,其中调用堆栈开始解析之前的所有调用点。最终结果是在不应有Os的地方出现Os,并且递归方法在清除调用堆栈之前永远不会“返回”。

将方法更改为bool返回类型不起作用。我已经尝试过了。我得到相同的结果。要么我遇到异常,要么我从最后的死角开始将Os覆盖Xs,一直到出口,一直到起点。

迷宫和我的代码在下面。请帮忙;我已经在这个问题上工作了六个小时,这让我很沮丧。

char[,] maze1 = {
            { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' },
            { '#', '.', '.', '.', '#', '.', '.', '.', '.', '.', '.', '#' },
            { '#', '.', '#', '.', '#', '.', '#', '#', '#', '#', '.', '#' },
            { '#', '#', '#', '.', '#', '.', '.', '.', '.', '#', '.', '#' },
            { '#', '.', '.', '.', '.', '#', '#', '#', '.', '#', '.', '.' },
            { '#', '#', '#', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
            { '#', '.', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
            { '#', '#', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
            { '#', '.', '.', '.', '.', '.', '.', '.', '.', '#', '.', '#' },
            { '#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '.', '#' },
            { '#', '.', '.', '.', '.', '.', '.', '#', '.', '.', '.', '#' },
            { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' }
        };

递归方法:

private void MazeTraversal(char[,] maze, int row, int col)
    {
        if (row < maze.GetLength(0) && col < maze.GetLength(1))
        {
            maze[row, col] = 'X';
            Console.Write(writer.WriteMaze(maze));
            System.Threading.Thread.Sleep(250);

            #region GoNorth
            // GoNorth
            if (maze[(row - 1), col] == '.')
            {
                MazeTraversal(maze, row - 1, col);
                if (wroteAnO)
                {
                    Console.Write(writer.WriteMaze(maze));
                    wroteAnO = false;
                    System.Threading.Thread.Sleep(250);
                }
            }
            #endregion

            #region GoSouth
            if (maze[(row + 1), col] == '.')
            {
                MazeTraversal(maze, row + 1, col);
                if (wroteAnO)
                {
                    Console.Write(writer.WriteMaze(maze));
                    wroteAnO = false;
                    System.Threading.Thread.Sleep(250);
                }
            }
            #endregion

            #region GoEast

            if (maze[row, (col + 1)] == '.')
            {
                MazeTraversal(maze, row, col + 1);
                if (wroteAnO)
                {
                    Console.Write(writer.WriteMaze(maze));
                    wroteAnO = false;
                    System.Threading.Thread.Sleep(250);
                }
            }
            #endregion

            #region GoWest
            if (maze[row, (col - 1)] == '.')
            {
                MazeTraversal(maze, row, col - 1);
                if (wroteAnO)
                {
                    Console.Write(writer.WriteMaze(maze));
                    wroteAnO = false;
                    System.Threading.Thread.Sleep(250);
                }
            }
            #endregion


        }
        // if nothing contains a ".", we can't go in any direction. Draw an "O"
        maze[row, col] = 'O';
        wroteAnO = true;
    }

1 个答案:

答案 0 :(得分:0)

您的问题可能是,永远不会达到等于数组长度的索引(因为最大索引始终为length-1),因此总是执行条件语句。尝试将if (row < maze.GetLength(0) && col < maze.GetLength(1))更改为if (row < maze.GetLength(0) - 1 && col < maze.GetLength(1) - 1)