C# 使用递归数组

C# 使用递归数组,c#,arrays,recursion,C#,Arrays,Recursion,现在我使用递归来计算数字之和,我想做一些稍微不同的事情。下面是我的代码,它将对数字1,2,3,4,5求和。如何修改代码,将数字1、2、3、4、5放入一个数组中,然后在递归方法中使用它?我尝试了很多不同的尝试,但我显然错过了一些东西。我知道在递归方法中,我希望使用数组的Length属性来控制它 苏珊 嗅嗅,嗅嗅,闻起来像是我的家庭作业 然而,这是一个暗示。添加长度为“n”的数组的所有元素与添加长度为“n-1”的数组的所有元素,然后添加元素“n”的值相同 将长度为“1”的数组的所有元素相加的结果就是

现在我使用递归来计算数字之和,我想做一些稍微不同的事情。下面是我的代码,它将对数字1,2,3,4,5求和。如何修改代码,将数字1、2、3、4、5放入一个数组中,然后在递归方法中使用它?我尝试了很多不同的尝试,但我显然错过了一些东西。我知道在递归方法中,我希望使用数组的Length属性来控制它

苏珊


嗅嗅,嗅嗅,闻起来像是我的家庭作业

然而,这是一个暗示。添加长度为“n”的数组的所有元素与添加长度为“n-1”的数组的所有元素,然后添加元素“n”的值相同


将长度为“1”的数组的所有元素相加的结果就是一个元素的值。我认为您需要在求和函数中传递数组和索引,以控制递归性。

使用一个

Stack Stack=新堆栈(新int[]{1,2,3,4,5});
Console.WriteLine(SumStack(stack));
公共静态int SumStack(堆栈输入)
{
返回input.Count>0?input.Pop()+SumStack(input):0;
}

您想要执行一个通常被称为“折叠”或“减少”的操作

幸运的是,.NET团队为您完成了(家庭)工作

    static int sum(int[] values)
    {
        return values.Aggregate<int>((hd, tl) => hd + tl);            
    } 

当然,如果你不擅长lambda表达式,或者你只有.NET2.0,这就足够简单了

static void Main(string[] args)
{

    int[] myArray = new int[5] {1,2,3,4,5 };

    Console.WriteLine(Sum1(myArray));
    Console.Read();

}

private static int Sum1(int[] myArray)
{

    if (myArray.Length > 0)
    {
        int lengthZeroAdjusted = myArray.Length - 1;
        int element = myArray[lengthZeroAdjusted];

        Array.Resize<int>(ref myArray, lengthZeroAdjusted);
        return element + Sum1(myArray);
    }
    else
    {
        return 0;
    }
}
static void Main(字符串[]args)
{
int[]myArray=newint[5]{1,2,3,4,5};
Console.WriteLine(Sum1(myArray));
Console.Read();
}
私有静态int-Sum1(int[]myArray)
{
如果(myArray.Length>0)
{
int lengthZeroAdjusted=myArray.Length-1;
int元素=myArray[lengthZeroAdjusted];
调整数组大小(参考myArray,lengthZeroAdjusted);
返回元素+Sum1(myArray);
}
其他的
{
返回0;
}
}

递归本质上意味着做小部分,把大部分交给其他人。 现在如果你需要数组中的n个元素,你可以让别人给你最后n-1个元素的和, 你自己先做一个。。。如果没有什么可以做的,就去处理吧

伪代码是:

   sum array start_index   =  if ( start_index >= length(array) ) return 0
                              else return array[start_index] = sum array (start_index + 1)

   print (sum array 0 )

我也是一个初学者,但这是我的解决方案,它对我很有用。

由于System.Array实现了IEnumerable,您不需要将数组转换为List,并且可以由编译器推断聚合方法的类型参数:return values.Aggregate((hd,tl)=>hd+tl);Doh,你完全正确。不知道我在想什么。编辑以反映你的观点。好吧,显然我们为人们做了家庭作业:(@Paul:我猜“接受”复选标记的15个代表(加上可能获得的向上投票)非常诱人。我喜欢这一个。鉴于原始问题所显示的经验水平,OP将此作为家庭作业答案是完全不可信的:)我想给她一个暗示,但没有给她答案:)好的,我咬。出于好奇,对于我的文化来说,它是什么语言?一些函数式语言是肯定的,但是有太多…:-)在这个方法中,我们传递数组myArray。然后我们将lengthZeroAdjusted设置为myArray.Length-1,即5-1(4)。那么下面这一行到底是用来做什么的:Array.Resize(ref myArray,lengthZeroAdjusted);SusanHi在那里SusanHi:)我想你需要一些与你最初的例子相同的东西,以便于理解。我想和这里的其他人一样,您可能是编程新手。如果你没有道歉。为了使函数仍然忠实于您所问的类型“array”,我只是简单地维护了该类型。通过这样做,我们处理数组类型的方式与其他一些建议略有不同。为了详细描述所需的内容,以便函数只使用一个数组,我们必须在每次递归时修改数组。在功能上类似于堆栈。我们获取数组中的最后一个值并将其存储在元素中,现在我们可以通过传递lengthZeroAdjusted将数组的大小减少1,其中lengthZeroAdjusted将始终比myArray小1。对于每个递归,数组将减少1,元素的值将成为新数组的最后一个元素。因此,Array.Resize是一个函数,它将所有元素从一个数组复制到另一个小于1的新数组,因此对于每个递归,最后一个元素都会被有效删除。一个可能更快的方法是使用称为位移位的方法来执行此操作,而不是数组复制。如果函数是泛型函数,我们可以传入一个int32数组,该数组随后将转换为一个字节数组。每次递归时,字节可以移位32位MSB。这对你来说是个挑战。请记住,递归对于简化操作是不起作用的,但如果这是您的任务,那么这就是实现这一点的“另一种”方法。
int[] values = new int[]{1,2,3,4,5};
Console.WriteLine(sum(values));
static void Main(string[] args)
{

    int[] myArray = new int[5] {1,2,3,4,5 };

    Console.WriteLine(Sum1(myArray));
    Console.Read();

}

private static int Sum1(int[] myArray)
{

    if (myArray.Length > 0)
    {
        int lengthZeroAdjusted = myArray.Length - 1;
        int element = myArray[lengthZeroAdjusted];

        Array.Resize<int>(ref myArray, lengthZeroAdjusted);
        return element + Sum1(myArray);
    }
    else
    {
        return 0;
    }
}
let seq = [1;2;3;4;5]

let rec samp nums = 
  match nums with
  | []      -> 0
  | h::t    -> h + samp t
   sum array start_index   =  if ( start_index >= length(array) ) return 0
                              else return array[start_index] = sum array (start_index + 1)

   print (sum array 0 )
static int Sum(int[] a, int index = 0)
{
    if (a[index] == a[a.Length - 1])
    {
        return a[a.Length - 1];
    }
    return a[index] + Sum(a, index + 1);
}

static void Main()
{
    int[] arr = {1, 2, 3, 9, 15};
    Console.WriteLine(Sum(arr));
}