Хм, есть несколько проблем с этой программой.
Наиболее очевидно: «верните maxwithout; верните 0;» должен выдать ошибку компиляции: нет способа добраться до этого последнего оператора return.
Во-вторых, вы возвращаетесь к решению по пути "maxwith", пока не достигнете конца массива. Затем вы вернетесь в maxwithout, впервые поразив его с индексом = 4. Я не думаю, что это сработает.
Честно говоря, я не думаю, что эта проблема действительно требует рекурсии. Наиболее естественным решением будет вложенный цикл:
for (int start=0;start<length;++start)
{
for (int end=start;end<length;++end)
{
// calculate the sum of arr[start]->arr[end] and compare to start
}
}
Или что-то на этот счет.
Требовала ли проблема решить ее с помощью рекурсии, или это была ваша первая идея для хорошего решения?
Редактировать
Хорошо, так что вы должны использовать рекурсию. Я предполагаю, что смысл урока в том, чтобы научиться использовать рекурсию, а не обязательно решать проблему наиболее естественным или эффективным способом. (Лично я думаю, что учитель должен был придумать проблему, когда рекурсия была естественным решением, но я думаю, что мы здесь не для того, чтобы критиковать учителя сегодня.)
Я не хочу делать твою домашнюю работу за тебя, но я дам тебе подсказку. Вы можете использовать рекурсию для имитации цикла, поместив условие останова в начало функции и поместив рекурсивный вызов в конец функции с параметром +1. То есть вместо написания
for (int x=0;x<10;++x) { ... whatever ...}
вы можете написать
void forx(int x)
{
if (x>=10)
return;
... whatever ...
forx(x+1);
}
Так что в этом случае я бы сделал что-то вроде:
void endloop(int start, int end)
{
if (end>=arrayLength)
return;
... work on running total ...
endloop(start, end+1);
}
void startloop(int start)
{
if (start>=arrayLength)
return;
endloop(start, start);
}
int main()
{
... setup ...
startloop(0);
... output ...
}
Списки параметров не обязательно являются полными. Как я уже сказал, я не хочу делать вашу домашнюю работу за вас, просто дать вам подсказку, чтобы начать.