对不起这个基本问题,但我已经花了几个小时。 问题:右移数组以执行指定的步骤 这是代码:
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
表达式,以便它给出错误的结果!调试时可以看到此行为。
不得更改方法签名。
任何帮助都非常感激。
答案 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);
}
}