递归函数没有按预期停止
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);
}
}
抱歉这个基本问题,但我已经花了几个小时。 问题: 将数组右移指定的步数 这是代码:
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);
}
}