递归函数未按预期停止

本文关键字:递归函数 | 更新日期: 2023-09-27 17:58:03

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

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循环。递归就是这里所需要的全部-它将确保重新运行数组,直到达到stop子句(shiftTimes==0)。

请注意,在递归调用中减少的变量shiftTimes不会反映到调用环境中——参数是按值传递的,因此会生成它的新副本,并且每次对ShiftRight的新调用都只减少副本。

您也不会对递归调用的返回值做任何操作,您应该返回它。

您正在尝试使用循环和递归。删除while循环,只返回带有更新的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);
    }
}