递归函数没有按预期停止

Recursive function not stopped as expected

抱歉这个基本问题,但我已经花了几个小时。 问题: 将数组右移指定的步数 这是代码:

static int[] ShiftRight(int[] arr, int shiftTimes)
    {
        if (shiftTimes == 0 || arr.Length == 0 || arr.Length == 1) return arr;

        var resultArray = new int[arr.Length];

        for (var i = 1; i < arr.Length; i++)
            resultArray[i] = arr[i - 1];

        resultArray[0] = arr[resultArray.Length - 1];

        while (shiftTimes > 1)
        {
            shiftTimes--;    
            ShiftRight(resultArray, shiftTimes);
        }            

        return resultArray;
    }

问题: 虽然 while 表达式在那里控制递归,但由于某些未知原因,在到达 return resultArray; 行后,程序返回到 while 表达式,因此给出了错误的结果!调试时可以看到此行为。

不得更改方法签名。

非常感谢任何帮助。

您根本不需要 while 循环。在这里你只需要递归——它会确保重新运行数组被移动直到到达停止子句 (shiftTimes==0)。

请注意,在递归调用中减少的变量 shiftTimes 不会反映到调用环境中 - 参数是按值传递的,因此会创建一个新副本,每次新调用时只会减少副本至 ShiftRight.

您也不要对递归调用的 return 值做任何事情,您应该 return 它。

您正在尝试使用循环和递归。删除 while 循环,只 return 函数本身和更新的 shiftTimes 变量。

public class Program
{
    public static void Main(string[] args)
    {
        int[] arr = ShiftRight(new int[] { 1,2,3,4,5,6,7,8,9,10}, 2);
        Console.WriteLine(String.Join(",",arr));
    }

    static int[] ShiftRight(int[] arr, int shiftTimes)
    {
        if (shiftTimes == 0 || arr.Length == 0 || arr.Length == 1) return arr;

        var resultArray = new int[arr.Length];

        for (var i = 1; i <= arr.Length; i++)
            resultArray[i%arr.Length] = arr[i - 1];

        return ShiftRight(resultArray, --shiftTimes);
    }
}