【问题标题】:Recursive function not stopped as expected递归函数未按预期停止
【发布时间】:2016-07-21 20:02:12
【问题描述】:

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

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 表达式,从而给出了错误的结果!此行为在调试时可见。

方法签名不得更改。

非常感谢任何帮助。

【问题讨论】:

  • 循环或递归 - 选择一个
  • 用 if 替换 while。也许它可能会起作用。
  • @MyIsaak:只是替换,但仍然得到错误的结果 - 一定还有其他地方我犯了错误!
  • @pm100: 绝对正确 - 谢谢你,但仍然得到错误的结果

标签: c# algorithm recursive-datastructures


【解决方案1】:

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

请注意,在递归调用中减少的变量 shiftTimes 不会反映到调用环境 - 参数是按值传递的,因此会制作它的新副本,并且每次新调用 @ 时只会减少副本987654321@.

你也不会对递归调用的返回值做任何事情,你应该返回它。

【讨论】:

  • 第二段对我非常有用 - 谢谢。关于第一段,你的意思是我应该用“if”替换“while”然后就可以了吗?虽然我已经这样做了,但仍然得到错误的结果 - 我错在哪一部分?
  • @AliAshoori 您甚至不需要 if,因为您在 shiftTimes == 0 时有停止子句,您只需返回输入数组 - 这是相同的。 (加上if没有错,但不是必须的)。
  • 天啊,你是对的,开头已经有了停止子句。这是令人失望但仍然是错误的结果:-(
  • @AliAshoori 你也缺少使用递归调用的返回值return ShiftRight(...)
【解决方案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);
    }
}

【讨论】:

    猜你喜欢
    • 2018-04-24
    • 1970-01-01
    • 2018-09-03
    • 2015-01-17
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多