C# 停止递归

C# 停止递归,c#,recursion,C#,Recursion,所以我制作了一个迷宫,“#”是墙,“.”是可以移动的坐标。我试图在递归走出迷宫时停止它。所以当其中一个(x,y)为12时。这可能是一个简单的解决方案 这是我的迷宫 char[,] maze1 = // USE THIS { { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' }, { '#', '.', '.', '.', '#', '.', '.', '.', '.',

所以我制作了一个迷宫,“#”是墙,“.”是可以移动的坐标。我试图在递归走出迷宫时停止它。所以当其中一个(x,y)为12时。这可能是一个简单的解决方案

这是我的迷宫

char[,] maze1 =
            // USE THIS
        { { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' },
        { '#', '.', '.', '.', '#', '.', '.', '.', '.', '.', '.', '#' },
        { '#', '.', '#', '.', '#', '.', '#', '#', '#', '#', '.', '#' },
        { '#', '#', '#', '.', '#', '.', '.', '.', '.', '#', '.', '#' },
        { '#', '.', '.', '.', '.', '#', '#', '#', '.', '#', '.', '.' },
        { '#', '#', '#', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
        { '#', '.', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
        { '#', '#', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
        { '#', '.', '.', '.', '.', '.', '.', '.', '.', '#', '.', '#' },
        { '#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '.', '#' },
        { '#', '.', '.', '.', '.', '.', '.', '#', '.', '.', '.', '#' },
        { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' } };
这是我的方法

private void mazeTraversal(int currentX, int currentY, char[,] maze)
    {
        /*************** ATTEMPT 1 ******************/

        // Checks if coordinates are inside the maze
        if (currentX <= 11 && currentY <= 11)
        {
            // Implement maze traversal recursive call
            //PrintOriginalMaze(maze, currentX, currentY);

            // If the coordinate is a '.' , continue(This is the base case)
            if ('.' == maze[currentX, currentY])
            {
                // Changes location to a X so you cant go back.
                maze[currentX, currentY] = 'X';

                // Implement maze traversal recursive call
                PrintOriginalMaze(maze, currentX, currentY);

                mazeTraversal(currentX, currentY + 1, maze);
                // maze[currentX, currentY] = 'X';

                mazeTraversal(currentX - 1, currentY, maze);
                //maze[currentX, currentY] = 'X';

                mazeTraversal(currentX + 1, currentY, maze);
                // maze[currentX, currentY] = 'X';

                mazeTraversal(currentX, currentY - 1, maze);
                //maze[currentX, currentY] = 'X';

            }

            if ('#' == maze[currentX, currentY])
            {
                Console.WriteLine("Hit a wall");
                Console.WriteLine();
            }
        }
    }
private void mazeTraversal(int currentX,int currentY,char[,]maze)
{
/***************尝试1******************/
//检查坐标是否在迷宫内
如果(currentX你真的应该在迷宫中放置一个“出口”节点。我想在[4][11]处。那么,如果你找到了出口(节点),那将是一个简单的检查

这里有一个关于游戏板的古老问题:“我如何处理游戏场外的东西?”以及“如果我在边界,想检查所有相邻的细胞,我该怎么办?”


在很大程度上,你避免了这个问题。你有一个“边界”墙的边界。在游戏板周围放置一个不可输入的边界是解决方案之一。另一个解决方案将处理所有索引检查。但就我个人而言,我更喜欢计算边界。

如果我理解你的问题,并且你试图确定当前的
x
y
是否超出你的迷宫边界(
数组

你可以用

获取中指定维度的最后一个元素的索引 数组

var maxX=maze1.GetUpperBound(0);
var maxY=maze1.GetUpperBound(1);
如果(currentX>maxX | | currentX<0 | | currentY>maxY | | currentY<0)
返回;

停止递归只是一致地退出方法(在某些状态下)若要打开调用,即在当前
xy
超出边界时使用
返回

如果x或y也为0,您是否会在迷宫之外?您应该显示更多代码以实际显示递归。此时,我猜代码属于
PrintOriginalMaze
e> mazeTraversal
do?顺便说一句,方法应该以大写开头。为什么要使用递归而不仅仅是循环?为什么我们在这里使用递归?我的意思是,这听起来像是stackoverflow'vile的单行道。另外,为什么不检查数组的边界呢?显然,如果你超出了边界,你就是goneskis
var maxX = maze1.GetUpperBound(0);
var maxY = maze1.GetUpperBound(1);

if (currentX > maxX || currentX < 0 || currentY > maxY || currentY < 0)
  return;