【发布时间】:2021-12-08 12:25:32
【问题描述】:
我对此一无所知。最初我自己尝试过,然后从 SO 和 google 复制,它适用于除一个以外的所有情况,但是在我的作业中仍然没有找到对特定测试用例足够快的递归算法:/
无论如何,这是为什么:
public static int FindMaximum(int[] array)
{
if (array is null)
{
throw new ArgumentNullException(nameof(array));
}
if (array.Length == 0)
{
throw new ArgumentException(null);
}
return FindMaxRec(array, array.Length);
}
public static int FindMaxRec(int[] arr, int n)
{
if (n == 1)
{
return arr[0];
}
return Math.Max(arr[n - 1], FindMaxRec(arr, n - 1));
}
不适用于此TestCase?:
[Test]
[Order(0)]
[Timeout(5_000)]
public void FindMaximum_TestForLargeArray()
{
int expected = this.max;
int actual = FindMaximum(this.array);
Assert.AreEqual(expected, actual);
}
编辑 1:
虽然这很好用,但我需要递归:
public static int FindMaximum(int[] array)
{
if (array is null)
{
throw new ArgumentNullException(nameof(array));
}
if (array.Length == 0)
{
throw new ArgumentException(null);
}
int maxValue = int.MinValue;
for (int i = 0; i < array.Length; i++)
{
if (array[i] > maxValue)
{
maxValue = array[i];
}
}
return maxValue;
}
【问题讨论】:
-
什么是“this.max”和“this.array”?这是理解测试用例的关键。
-
有什么限制?不允许排序吗?另外,为什么不尝试迭代方法而不是递归呢?
-
@Linascts 迭代会更好,只需一次扫描就足够了。应该以 O(N) 时间复杂度运行。递归会增加栈帧的开销。
-
嗯,您有一个长度为 10.000.000 的数组,因此您的递归深度为 10.000.000。难怪这很慢(如果它甚至到达终点并且没有异常)。在这种用例中,recusion 的整个想法是“分而治之”。我个人建议一种算法,它将数组分成两半,然后在每一半上递归调用它,然后从这两个结果中取最大值。这样做直到两半的长度都为 1 这将使您的递归深度从 10000000 下降到 24
-
@derpirscher 将数组分成两半似乎是正确的解决方案(Dmitry 的解决方案),我在 Nigel 的解决方案上实现枚举器时遇到了一些困难,但它也应该可以工作。
标签: c# arrays testing recursion max