无法返回最大元素

时间:2014-01-16 14:27:14

标签: 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 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。

它有什么问题?

全部谢谢

5 个答案:

答案 0 :(得分:7)

你失去了maxval的价值。

试试这个:

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

除非您将此作为个人练习或作业,否则您可以使用LINQ更优雅地处理此方式

var maxValue = Array.Max();

答案 1 :(得分:1)

要使用递归,您应该进行停止测试,并确保始终在较小的问题上启动下一步。

试试这个:(不确定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
    }
}

注意:它不适用于负值。

答案 2 :(得分:0)

    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;
    }

OR

var max1 = Array.Max();
var max2 = Array.Concat(new[] { 0 }).Max();
var max3 = Array.OrderByDescending(p => p).FirstOrDefault();

答案 3 :(得分:0)

您不使用来自CalculateMax

的更深调用的返回值

更改

CalculateMax(Array, ++Startpos, maxval);

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

这样你不仅可以向前传递maxval,还可以向后传递给main()。

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

答案 4 :(得分:-1)

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

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;
  }
}