为什么我的C#递归在它命中时不会停止?

时间:2017-06-25 10:45:53

标签: c# recursion visual-studio-2017

我尝试创建一个函数,通过进行首次可用性选择其路径的递归来找到到达数组末尾的最快路径。由于某种原因,递归在返回true时不会停止。为什么呢?

static void Main(string[] args)
    {
        int[,] arr = new int[5, 5];
        arr[0, 0] = 2;
        if (PathFinder(arr, 0, 0))
        { 
        printarr(arr);
        }
    }

    static bool PathFinder(int[,] arr, int y,int x)
    {


        if (arr[arr.GetLength(0) - 1, arr.GetLength(1) - 1] == 2)
        {   
            return true;

        }
        else
        {
            /////Right
            if (x != arr.GetLength(1) - 1 && arr[y, x + 1] != 2 && arr[y, x + 1] == 0)
            {
                arr[y, x + 1] = 2;
                printarr(arr);
                Console.WriteLine("");
                PathFinder(arr, y, x + 1);

            }
            /////Down
            if (y != arr.GetLength(0) - 1 && arr[y + 1, x] != 2 && arr[y + 1, x] == 0)
            {
                arr[y + 1, x] = 2;
                printarr(arr);
                Console.WriteLine("");
                PathFinder(arr, y + 1, x);

            }
            /////UP
            if (y!=0 && arr[y-1,x]!=2 && arr[y - 1, x] == 0)
            {
                arr[y - 1, x] = 2;
                printarr(arr);
                Console.WriteLine("");
                PathFinder(arr,y-1,x);

            }
            /////Left
            if (x != 0 && arr[y, x-1] != 2 && arr[y, x - 1] == 0)
            {
                arr[y, x - 1] = 2;
                printarr(arr);
                Console.WriteLine("");
                PathFinder(arr, y, x - 1);

            }
            return false;

        }


    }

    static void printarr(int[,] arr)
    {
        for (int row = 0; row < arr.GetLength(0); row++)
        {
            for (int colom = 0; colom < arr.GetLength(1); colom++)
            {
                Console.Write(arr[row, colom] + " ");

            }
            Console.WriteLine("");
        }

    }

1 个答案:

答案 0 :(得分:2)

如果以递归方式调用具有返回类型的方法而不存储该返回值,则它将在调用之后继续。您已通过名称PathFinder(...调用它,因此当返回true时,您的递归调用不会传递它。像这样更改你的代码:

static bool PathFinder(int[,] arr, int y, int x)
{
    if (arr[arr.GetLength(0) - 1, arr.GetLength(1) - 1] == 2)
    {
        return true;
    }
    else
    {
        /////Right
        if (x != arr.GetLength(1) - 1 && arr[y, x + 1] != 2 && arr[y, x + 1] == 0)
        {
            arr[y, x + 1] = 2;
            printarr(arr);
            Console.WriteLine("");
            return PathFinder(arr, y, x + 1);
        }
        /////Down
        if (y != arr.GetLength(0) - 1 && arr[y + 1, x] != 2 && arr[y + 1, x] == 0)
        {
            arr[y + 1, x] = 2;
            printarr(arr);
            Console.WriteLine("");
            return PathFinder(arr, y + 1, x);
        }
        /////UP
        if (y != 0 && arr[y - 1, x] != 2 && arr[y - 1, x] == 0)
        {
            arr[y - 1, x] = 2;
            printarr(arr);
            Console.WriteLine("");
            return PathFinder(arr, y - 1, x);
        }
        /////Left
        if (x != 0 && arr[y, x - 1] != 2 && arr[y, x - 1] == 0)
        {
            arr[y, x - 1] = 2;
            printarr(arr);
            Console.WriteLine("");
            return PathFinder(arr, y, x - 1);
        }
        return false;
    }
}

这样,当你点击return true;时,该值将一直传递回调用堆栈,并且在返回false之前不会继续处理;

对没有返回类型的方法的递归调用应该在某个地方有一个return;语句,这样它们就可以逃脱,否则你会遇到StackOverflowException