У меня проблемы с алгоритмами разделения и покорения и искал какую-то помощь. Я пытаюсь написать функцию 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 также дает хорошее объяснение того, где мой код подвергался ошибкам.
Пробовали ли вы свою программу с небольшим размером выборки, скажем, 4 пунктов? Вот как вы должны в конечном итоге понять это (также используйте ваш отладчик для перехода через ваш код). – PaulMcKenzie
'int lsum = anArray [mid] + sumArray (anArray, --mid);' У этого есть запах неопределенного поведения. Вы меняете 'mid' и используете его как индекс массива, все в той же последовательности. – PaulMcKenzie
@ldgorman спасибо, что напомнили мне! Я был настолько доволен работой над остальной проблемой, что забыл вернуться и принять ответ – Nea