我在分治算法方面遇到了一些困难,需要一些帮助。我试图编写一个名为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的回答也很好地解释了我的代码出现错误的原因。
int lsum = anArray [mid] + sumArray(anArray, --mid);
这段代码存在未定义行为的味道。在同一序列中更改了mid
并将其用作数组下标。 - PaulMcKenzie