【问题标题】:Using arrays with recursion使用带有递归的数组
【发布时间】:2009-04-24 15:59:13
【问题描述】:

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

苏珊

   static void Main(string[] args)
    {
        Console.WriteLine(Sum(5));
        Console.Read();
    }

    static int Sum(int value)
    {
        if (value > 0) 
        {
            return value + Sum(value - 1);
        }
        else
        {
            return 0;
        }
    }

【问题讨论】:

  • 好的,显然我们确实为人们做作业:(
  • @Paul:我猜“接受”复选标记的 15 个代表(加上可能获得的赞成票)只是很诱人。

标签: c# arrays recursion


【解决方案1】:
let seq = [1;2;3;4;5]

let rec samp nums = 
  match nums with
  | []      -> 0
  | h::t    -> h + samp t

【讨论】:

  • 我喜欢这个。考虑到原始问题显示的经验水平,OP 将其作为作业答案提交是完全不可信的 :)
  • 我想给她一个提示,但没有给她答案:)
  • 好吧,我咬。出于好奇,对于我的文化,它是什么语言?肯定有一些函数式语言,但是有很多...... :-)
【解决方案2】:

使用Stack 怎么样?:

Stack<int> stack = new Stack<int>(new int [] {1,2,3,4,5});
Console.WriteLine(SumStack(stack));

public static int SumStack(Stack<int> input)
{
    return input.Count > 0 ? input.Pop() + SumStack(input) : 0;
}

【讨论】:

    【解决方案3】:
    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));
    }
    

    我也是初学者,但这是我的解决方案,它适用于我。

    【讨论】:

      【解决方案4】:

      闻,闻,闻起来像作业。

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

      将长度为'1'的数组的所有元素相加的结果只是一个元素的值

      【讨论】:

        【解决方案5】:

        我认为您需要在 Sum 函数中传递数组索引来控制递归性。

        【讨论】:

          【解决方案6】:

          如果你不擅长 lambda 表达式或者你只有 .net 2.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;
              }
          }
          

          【讨论】:

          • 所以在这个方法中,我们传递了数组 myArray。然后我们将 lengthZeroAdjusted 设置为 myArray.Length - 1,即 5 - 1 (4)。那么下面这行到底是做什么用的: Array.Resize(ref myArray, lengthZeroAdjusted);苏珊
          • 您好,Susan :) 我认为您需要与最初示例相同的内容,以便于理解。我假设和这里的其他人一样,您可能是编程新手。抱歉,如果您不这样做。为了使该函数忠实于您询问的类型“数组”,我只是维护了该类型。通过这样做,我们处理数组类型的方式与其他一些建议略有不同。
          • 详细描述需要什么,让所有的函数都是一个数组,那一定是我们每次递归都要修改数组。在功能上类似于堆栈en.csharp-online.net/Generic_Stack。我们获取数组中的最后一个值并将其存储在元素中,我们现在可以通过传递 lengthZeroAdjusted 将数组的大小减少 1,其中将始终比 myArray 小 1。
          • 对于每次递归,数组都会减少一个,并且元素的值将成为 new 数组的最后一个元素。因此,Array.Resize 是一个函数,它将一个数组中的所有元素复制到另一个小 1 的新数组中,因此对于每次递归,最后一个元素都被有效删除。
          • 一种可能更快的方法是使用位移而不是数组复制来执行此操作。如果该函数是通用函数,我们可以传入一个 int32 数组,该数组随后将转换为字节数组。每次递归时,字节可以移动 32 位 MSB。这对你来说是一个挑战。请记住,递归对于归约操作不是高效的,但如果这是您的任务,那么这是执行此操作的“另一种”方式。
          【解决方案7】:

          您想要执行通常称为“折叠”也称为“减少”的操作。

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

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

          如果您愿意,您可以重写它以提高可读性。 ;)

          编辑:使用示例

          int[] values = new int[]{1,2,3,4,5};
          Console.WriteLine(sum(values));
          

          【讨论】:

          • 由于 System.Array 实现了 IEnumerable,因此不需要将数组转换为 List,并且 Aggregate 方法的类型参数,编译器可以推断:return values.Aggregate((hd , tl) => hd + tl);
          • Doh,你说得对。不知道我在想什么。编辑以反映您的观点。
          【解决方案8】:

          递归本质上意味着做一小部分,并将大部分交给其他人。 现在如果你必须'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 )
          

          【讨论】:

            猜你喜欢
            • 2017-03-25
            • 2017-07-23
            • 2018-08-13
            • 2016-12-13
            • 2012-06-16
            • 2019-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多