I got to pass the challenge just by following the same logic as in the example provided but I didn’t feel like moving on since I wasn’t able to understand what I had done. So I check the blog post in the Watch a Video section. The concept there became clear (-er) but when I look back at the example and my solution in the exercise, I still get stocked at this line:
return multiply(arr, n - 1) + arr[n];
How does the function know what to sum (or multiply) to arr[n]? The first term (arr, n - 1) is an array of numbers and a decreasing number, so where in the function are we instructing to take 1 number from the array and sum it to arr[n]. Are we then pushing this to arr[0]? Is there more in this function that is not visible the learner?
Thanks in advance to anyone who can dumb-down this whole thing.
Your code so far
function sum(arr, n) {
// Only change code below this line
// Only change code above this line
}
Your browser information:
User Agent is: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:70.0) Gecko/20100101 Firefox/70.0.
Blockquote How does the function know what to sum (or multiply) to arr[n] ? The first term (arr, n - 1) is an array of numbers and a decreasing number, so where in the function are we instructing to take 1 number from the array and sum it to arr[n] . Are we then pushing this to arr[0] ? Is there more in this function that is not visible the learner?
The function doesn’t know; it calls itself again with the multiply(arr, n-1) or in this case sum(arr, n-1) call. Only when all the recursion calls are complete is the final sum computed. Take a look at how the recursion works by breaking it down step by step:
Summary
Spoiler for this lesson:
// Assume the array is integers 1-5, and n is 4, remembering array starts at 0.
// ([1, 2, 3, 4, 5], 4)
function sum(arr, n) {
// leaving out conditional here for brevity
return sum(arr, n - 1) + arr[n];
sum([1,2,3,4,5],4) // function starts with these values passed to it
arr n
// we get the following
// first call results in
sum([1,2,3,4,5],3) + 5
// second call
sum([1,2,3,4,5],2) + 4 + 5
// third etc.
sum([1,2,3,4,5],1) + 3 + 4 + 5
sum([1,2,3,4,5],0) + 2 + 3 + 4 + 5
catches if statement
1 + 2 + 3 + 4 + 5
Thank you, @opalko! I think I’m finally getting this.
So calling the function only leaves + 5 (the position of n in the array) and so on until it can’t be called anymore at which point the addition finally happens and the result is returned. The only thing I’m still not quite understanding is why we’re returning arr[0] to escape the recursion. I understand we need a return statement to escape, but why the first position in the array?
It doesn’t have to necessarily be the first position where n=0, but in this case we were following the example of working backwards from n to 0 in this line:
return multiply(arr, n - 1) * arr[n];
We could have started at 0 and worked “up” the array to n but it would require some clever array manipulation and a conditional checking to see if we reached the last item in the array.
It will be easiest to get help by creating your own topic when you have specific questions about your own challenge code.
The easiest way to create a topic for help with your own code is to click the Ask for Help button located on each challenge. This will automatically import your code in a readable format and pull in the challenge url while still allowing you to ask any question about the challenge or your code.