У меня возникли проблемы с алгоритмами «разделяй и властвуй», и я искал помощи. Я пытаюсь написать функцию с именем 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;
}
Я определил проблему в том, что функция включает значение lsum в вычисление rsum. Я знаю, что проблема заключается в моем рекурсивном вызове sumArray с использованием rsize (переменная, равная размеру исходного массива минус средняя точка). Однако по какой-то причине я не могу найти исправление.
Я чувствую себя глупо спрашивать, так как знаю, что ответ смотрит мне прямо в лицо, но как мне исправить мою функцию, чтобы она возвращала точный результат?
ОБНОВЛЕНИЕ. Благодаря всем полезным ответам я исправил свой код, теперь он компилируется и работает нормально. Я оставлю свой исходный код здесь на случай, если другие борются с разделяй и властвуй и могут совершать аналогичные ошибки. Чтобы узнать о функции, которая правильно решает проблему, см. ответ @Laura M. Ответ @haris также дает хорошее объяснение того, где в моем коде возникали ошибки.
int lsum = anArray [mid] + sumArray(anArray, --mid);
Попахивает неопределенным поведением. Вы меняетеmid
и используете его как индекс массива, все в той же последовательности. - person PaulMcKenzie   schedule 13.10.2014