递归函数未按预期停止

时间:2016-07-21 20:02:12

标签: c# algorithm recursive-datastructures

对不起这个基本问题,但我已经花了几个小时。 问题:右移数组以执行指定的步骤 这是代码:

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表达式,以便它给出错误的结果!调试时可以看到此行为。

不得更改方法签名。

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:4)

根本不需要while循环。这里只需要递归 - 它将确保重新运行数组,直到达到stop子句(shiftTimes == 0)为止。

请注意,在递归调用中减少的变量shiftTimes不会反映到调用环境中 - 参数按值传递,因此会生成一个新副本,并且每次调用{时,只会减少副本{1}}。

您也不会对递归调用的返回值执行任何操作,您应该将其返回。

答案 1 :(得分:2)

您正在尝试使用循环和递归。删除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);
    }
}