Hi I am trying to write a recursive function that adds an array of integers. When I run this it actually crashes the console window so I'm guessing I must be doing something wrong to create a stack overflow? Here is the main program with the function.

#include <iostream>using namespace std;int sumOfElements(const int arr[], int size);int main(){ int answer; int arrSize; cout << "how many numbers do you want to add" << endl; cin >> arrSize; int num[arrSize]; for (int i = 0; i < arrSize; i++) { cout << "Enter number " << i + 1 << ": "; cin >> num[i]; } answer = sumOfElements(num,arrSize); cout << "The sum of the numbers entered is: " << answer << endl; return 0;}int sumOfElements(const int arr[], int size){ int sum = arr[0]; if (size == 1) return sum; else return sum+= sumOfElements(arr, size + 1);}

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

One important thing in recursive programming is a valid stopping criteria--something that you are sure will always reach. Your stopping criterion is size == 1. While you are adding 1 to size for passing the next function. I don't see how size value will ever converge to 1. It so appears that it will keep on increasing so it will keep calling functions and will never get a chance to back track to the caller function.

Dmon443Author Commented:

ok now my second attempt with the help of your advice seems to be almost working but for some numbers it is not working eg if I add 5 numbers together 1 2 3 4 5 it throws out 5 as the answer and if I put them the opposite way 5 4 3 2 1 it throws out 25. Sometimes it works fine eg if I put 4 numbers 4 4 4 4 it gives the correct answer 16.

#include <iostream>using namespace std;int sumOfElements(const int arr[], int size, int sum);int main(){ int answer; int arrSize; int sum = 0; cout << "how many numbers do you want to add" << endl; cin >> arrSize; int num[arrSize]; for (int i = 0; i < arrSize; i++) { cout << "Enter number " << i + 1 << ": "; cin >> num[i]; } sum = num[0]; answer = sumOfElements(num,arrSize, sum); cout << "The sum of the numbers entered is: " << answer << endl; return 0;}int sumOfElements(const int arr[], int size, int sum){ if (size == 1) return sum; else return sum+= sumOfElements(arr, size - 1, sum);}

Where are you actually adding elements of the array? I don't see you indexing the array anywhere.

Do you wonder if your IT business is truly profitable or if you should raise your prices? Learn how to calculate your overhead burden with our free interactive tool and use it to determine the right price for your IT services. Download your free eBook now!

Think about the results you are getting and the numbers you are entering. Do you see any correlation in the fact that whenever you enter n identical numbers, you get a result that is n * [the number]? Why is that?

If you are trying to add elements of array, you should be passing only the index NOT sum and the it should return value of that element like

return arr[index];
instead of return sum

I think there's a mix-up of terminology going on in that statement. I agree that you should be "passing" some sort of index (or indexed value), but the "return" is valid as is written = )

You don't need sum parameter and termination should be 0.

Function should only be
if ( size > 0)
return arr[size] + sumOfElements(arr, size - 1);
else
return arr[0];

So, if the array has 3 elements, you should call it with size 2 initially. There are sure other ways to do the same thing.

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Aw farzanj... I know you know better than this ; )

return arr[size] ...

*grin*

Dmon443Author Commented:

Isn't return arr[size] and return arr[0] the same thing? Gives the same results when I try both and logically they are the same thing.

ok so now I have the function as follows:
int sumOfElements(const int arr[], int size)
{
if (size > 0)
return arr[size]+ sumOfElements(arr, size - 1);
else
return arr[0];

}
But now this is producing some weird results if I choose 3 numbers to add no matter what numbers I put in the answer is always 4199524 and if I choose 4 numbers same thing happens give a massive number like 4469876. But if I choose 5 numbers to add it works perfectly.

Kaufmed, I always try to learn from you. Here is the complete code that I wanted to say. It works for me and it is recursive. Kindly tell me how would you write it. It produces the correct result in every situation.

#include<iostream>using namespace std;int sumOfElements(const int[], int);int main(){ int arr[3] = {3, 5, 7}; int sum = sumOfElements(arr, 2); cout << "Sum : " << sum << endl; //system("pause"); return 0;}int sumOfElements(const int arr[], int index){ if(index > 0) { return arr[index] + sumOfElements( arr, index -1); } else { return arr[0]; }}

arr[size] should never be used because arrays are indexed starting at 0, and the maximum index of an array will be 1 less than its size. arr[size] would give you then next slot of memory after the last slot in the array, but since you haven't explicitly requested that slot (and set its value), there is no telling what is in that slot.

I was just using the size term as he was using it. I always meant index. I never meant size, sorry for the confusion. You can see in my first response too as I said.

He has to pass the maximum index of array and it would reduce to 0 eventually. But in the terminal case, I do not want another recursive call to the function that it why I used return arr[0] alone. Makes sense?

It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for freeEdge Out The Competitionfor your dream job with proven skills and certifications.Get started todayStand Outas the employee with proven skills.Start learning today for freeMove Your Career Forwardwith certification training in the latest technologies.Start your trial today