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