我试图使用递归来从数组返回最大元素 这是我的代码
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。
它有什么问题?
全部谢谢
答案 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;
}
}