C# 无法返回最大元素

C# 无法返回最大元素,c#,C#,我正在尝试使用递归从数组返回最大元素 这是我的密码 static void Main(string[] args) { int[] Array=new int[]{10,233,34}; int _MaxVal = CalculateMax(Array, 0, 0); Console.WriteLine(_MaxVal); Console.ReadKey(); } private static

我正在尝试使用递归从数组返回最大元素
这是我的密码

    static void Main(string[] args)
    {
        int[] Array=new int[]{10,233,34};

        int _MaxVal = CalculateMax(Array, 0, 0);
        Console.WriteLine(_MaxVal);
        Console.ReadKey();

    }

    private static int CalculateMax(int[] Array, int Startpos, int maxval)
    {
        if (Startpos != Array.Length)
        {
            if (Array[Startpos] > maxval)
            {
                maxval = Array[Startpos];
            }


            CalculateMax(Array, ++Startpos, maxval);
        }

        return maxval;
    }
我得到的MaxVal是10

有什么问题吗


谢谢大家

您正在丢失
maxval
的值

试试这个:

maxval = CalculateMax(Array, ++Startpos, maxval);
除非您将此作为个人练习或任务,否则您可以通过LINQ更优雅地处理此问题:

var maxValue = Array.Max();

要使用递归,您应该有一个停止测试,并确保总是对较小的问题启动下一步

试试这个:(不确定Array.SubArray(int)是否是一个实函数,但这就是想法

static void Main(string[] args)
{
    int[] Array=new int[]{10,233,34};

    int _MaxVal = CalculateMax(Array);
    Console.WriteLine(_MaxVal);
    Console.ReadKey();

}

private static int CalculateMax(int[] Array)
{
    if (Array.Length > 0)
    {
        int maxSubArray = CalculateMax(Array.SubArray(1)); // Use recursive function on the SubArray starting at index 1 (that the smaller problem)
        if (maxSubArray > Array[0])
        {
            return maxSubArray;
        } else {
            return Array[0];
        }

    } else {
        return 0; // Stop test
    }
}

注意:它不适用于负值。

您没有使用递归调用的返回值。这:

    static void Main(string[] args)
    {
        int[] Array = new int[] { 10, 233, 34 };

        int _MaxVal = CalculateMax(Array);
        Console.WriteLine(_MaxVal);
        Console.ReadKey();

    }
    private static int CalculateMax(int[] Array)
    {
        int max = 0;
        for (int i = 0; i < Array.Length; i++)
            if (Array[i] > max)
                max = Array[i];
        return max;
    }
CalculateMax(Array, ++Startpos, maxval);
应该是:

maxval = CalculateMax(Array, ++Startpos, maxval);
无论如何,您使用的是递归而不是循环,这是一种非常糟糕的使用递归的方法。您将执行与数组中的项一样深的递归,这意味着您有一个非常慢的循环,如果数组太大,您将得到堆栈溢出

为了正确地使用递归,您应该将工作划分为更小的部分,并使用递归来处理那些更小的部分,直到这些部分变得非常小,变得微不足道

例如,将每个级别的阵列一分为二:

int[] Array = new int[]{ 10, 233, 34 };
int _MaxVal = CalculateMax(Array, 0, Array.Length);
Console.WriteLine(_MaxVal);

private static int CalculateMax(int[] array, int start, int length) {
  if (length == 1) {
    return array[start];
  } else {
    int half = length / 2;
    int first = CalculateMax(array, start, half);
    int second = CalculateMax(array, start + half, length - half);
    return first > second ? first : second;
  }
}

您不使用
CalculateMax

改变

CalculateMax(Array, ++Startpos, maxval);

这样,您不仅可以向前传递
maxval
,还可以向后传递到main()


正如(可能)之前所说的,递归并不是最好的方法,因为堆栈溢出可能会发生。

您是否也希望执行
maxval=CalculateMax(Array,++Startpos,maxval);
?递归调用时,您没有考虑
CalculateMax()的返回值。
您知道可以执行
=Array.Max()
,对吗?学习递归很好,但并不是所有的东西都需要(或应该)递归。我试图使用递归+1实现它。我还想补充一点,最好为
int.MinValue
maxval
设置一个初始值,否则如果最大值小于零,则结果是错误的。(如果数组为空,应该怎么做是另一个问题)。这是一种使用递归的好方法,在函数末尾使用递归可以优化为循环,这是一种常见的模式@Hogan:C#不做尾部递归:稍微过时了-@Hogan:谢谢更新。请注意,它只在x64模式下执行,而不是在x86模式下。无论如何,问题中的代码在任何情况下,这仍然是一个不好的使用复发。
CalculateMax(Array, ++Startpos, maxval);
maxval = CalculateMax(Array, ++Startpos, maxval);