【发布时间】:2014-12-08 06:19:02
【问题描述】:
我在使用分而治之的算法时遇到了一些麻烦,正在寻求帮助。我正在尝试编写一个名为 sumArray 的函数来计算整数数组的总和。
这个函数必须通过将数组分成两半并在每一半上执行递归调用来完成。我尝试使用与我在编写递归求和算法和分治算法来识别数组中的最大元素时使用的概念相似的概念,但我正在努力将这两个想法结合起来。
下面是我为 sumArray 编写的代码,它可以编译,但不会返回正确的结果。
int sumArray(int anArray[], int size)
{
int total = 0;
//base case
if (size == 0)
{
return 0;
}
else if (size == 1)
{
return anArray[0];
}
//divide and conquer
int mid = size / 2;
int lsum = anArray [mid] + sumArray(anArray, --mid);
int rsize = size - mid;
int rsum = anArray[size - mid] + sumArray(anArray + mid, --rsize);
return lsum + rsum;
}
我发现问题在于函数在计算 rsum 时包含了 lsum 的值。我知道问题在于我使用 rsize (一个等于原始数组大小减去中点的变量)对 sumArray 的递归调用。但是,出于某种原因,我似乎无法确定修复方法。
我觉得这个问题很愚蠢,因为我知道答案就在眼前,但是如何修复我的函数以使其返回准确的结果?
更新:感谢所有有用的回复,我已经修复了我的代码,以便它可以很好地编译和运行。我将把我的原始代码留在这里,以防其他人在分而治之的情况下苦苦挣扎,并且可能会犯类似的错误。有关正确解决问题的功能,请参阅@Laura M 的答案。 @haris 的回复也很好地解释了我的代码在哪里出错。
【问题讨论】:
-
您是否尝试过使用小样本(例如 4 个项目)的程序?这就是你最终应该如何解决这个问题(也使用你的调试器来单步调试你的代码)。
-
int lsum = anArray [mid] + sumArray(anArray, --mid);这有未定义行为的味道。您正在更改mid并将其用作数组下标,所有这些都以相同的顺序进行。 -
@ldgorman 谢谢你提醒我!我忙于解决剩下的问题,以至于忘记了回来接受答案
标签: c++ arrays algorithm recursion divide-and-conquer