递归函数未按预期停止
本文关键字:递归函数 | 更新日期: 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);
}
}