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(…)