C# 递归函数未按预期停止
对不起,这个基本的问题,但我已经花了几个小时的时间。 问题:将指定步骤的数组右移 代码如下:C# 递归函数未按预期停止,c#,algorithm,recursive-datastructures,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
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;
}
static int[]ShiftRight(int[]arr,int-shiftTimes)
{
if(shiftTimes==0 | | arr.Length==0 | | arr.Length==1)返回arr;
var resultArray=新整数[arr.Length];
对于(变量i=1;i1)
{
移动时间--;
ShiftRight(resultArray,shiftTimes);
}
返回结果数组;
}
问题:
尽管while
表达式用于控制递归,但由于某些未知原因,在到达返回结果数组之后代码>行,程序返回到while
表达式,从而给出错误的结果!此行为在调试时可见
方法签名不得更改
非常感谢您的帮助。您根本不需要while循环。这里只需要递归——它将确保重新运行数组,直到达到stop子句(shiftTimes==0)为止
请注意,在递归调用中减少的变量shiftTimes不会反映到调用环境中-参数是按值传递的,因此会创建它的新副本,并且每次对ShiftRight
的新调用只会减少副本
您也不需要对递归调用的返回值执行任何操作,您应该返回它。您根本不需要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);
}
}
公共类程序
{
公共静态void Main(字符串[]args)
{
int[]arr=ShiftRight(新的int[]{1,2,3,4,5,6,7,8,9,10},2);
Console.WriteLine(String.Join(“,”,arr));
}
静态int[]ShiftRight(int[]arr,int shiftTimes)
{
if(shiftTimes==0 | | arr.Length==0 | | arr.Length==1)返回arr;
var resultArray=新整数[arr.Length];
对于(var i=1;i您正在尝试使用循环和递归。请删除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);
}
}
公共类程序
{
公共静态void Main(字符串[]args)
{
int[]arr=ShiftRight(新的int[]{1,2,3,4,5,6,7,8,9,10},2);
Console.WriteLine(String.Join(“,”,arr));
}
静态int[]ShiftRight(int[]arr,int shiftTimes)
{
if(shiftTimes==0 | | arr.Length==0 | | arr.Length==1)返回arr;
var resultArray=新整数[arr.Length];
对于(var i=1;我要么循环,要么递归-选择oneReplace the while with if。也许它会起作用。@MyIsaak:只是替换,但仍然得到错误的结果-肯定还有其他地方我犯了错误!@pm100:完全正确-谢谢,但仍然得到错误的结果其他循环或递归-选择oneReplace the while with if。谢谢ps它可能有用。@MyIsaak:只是替换,但仍然得到错误的结果-肯定还有其他地方我犯了错误!@pm100:绝对正确-谢谢,但仍然得到错误的结果第二段对我非常有用-谢谢。关于第一段,你的意思是我应该用“如果”替换“while”然后就好了?虽然我做了,但仍然得到了错误的结果-我错在了什么部分?@AliAshoori您甚至不需要if,因为当shiftTimes==0
时,您有stop子句,您只需返回输入数组-这是相同的。(添加if没有错,但不需要).OMG,您是对的,在开头已经有了stop子句。这是一个令人失望但仍然错误的结果:-(@AliAshoori)您使用递归调用的返回值也丢失了return ShiftRight(…)
第二段对我非常有用-谢谢。关于第一段,您的意思是我应该替换“while”吗使用“if”就可以了?虽然我这样做了,但仍然得到了错误的结果-我错在了什么部分?@AliAshoori您甚至不需要if,因为当shiftTimes==0
时,您有stop子句,您只需返回输入数组-这是相同的。(添加if没有错,但不需要).OMG,您是对的,在开头已经有了stop子句。这是一个令人失望但仍然错误的结果:-(@AliAshoori)您使用递归调用的返回值return ShiftRight(…)