--- id: 5cfa3679138e7d9595b9d9d4 title: Replace Loops using Recursion challengeType: 1 videoUrl: 'https://www.freecodecamp.org/news/how-recursion-works-explained-with-flowcharts-and-a-video-de61f40cb7f9/' forumTopicId: 301175 --- ## Description
Recursion is the concept that a function can be expressed in terms of itself. To help understand this, start by thinking about the following task: multiply the elements from 0 to n inclusive in an array to create the product of those elements. Using a for loop, you could do this: ```js function multiply(arr, n) { var product = arr[0]; for (var i = 1; i <= n; i++) { product *= arr[i]; } return product; } ``` However, notice that multiply(arr, n) == multiply(arr, n - 1) * arr[n]. That means you can rewrite multiply in terms of itself and never need to use a loop. ```js function multiply(arr, n) { if (n <= 0) { return arr[0]; } else { return multiply(arr, n - 1) * arr[n]; } } ``` The recursive version of multiply breaks down like this. In the base case, where n <= 0, it returns the result, arr[0]. For larger values of n, it calls itself, but with n - 1. That function call is evaluated in the same way, calling multiply again until n = 0. At this point, all the functions can return and the original multiply returns the answer. Note: Recursive functions must have a base case when they return without calling the function again (in this example, when n <= 0), otherwise they can never finish executing.
## Instructions
Write a recursive function, sum(arr, n), that returns the sum of the elements from 0 to n inclusive in an array arr.
## Tests
``` yml tests: - text: sum([1], 0) should equal 1. testString: assert.equal(sum([1], 0), 1); - text: sum([2, 3, 4], 1) should equal 5. testString: assert.equal(sum([2, 3, 4], 1), 5); - text: Your code should not rely on any kind of loops (for or while or higher order functions such as forEach, map, filter, or reduce.). testString: assert(!removeJSComments(code).match(/for|while|forEach|map|filter|reduce/g)); - text: You should use recursion to solve this problem. testString: assert(removeJSComments(sum.toString()).match(/sum\(.*\).*\{.*sum\(.*\).*\}/s)); ```
## Challenge Seed
```js function sum(arr, n) { // Only change code below this line // Only change code above this line } ```
### After Test
```js const removeJSComments = str => str.replace(/\/\*[\s\S]*?\*\/|\/\/.*$/gm, ''); ```
## Solution
```js function sum(arr, n) { // Only change code below this line if(n <= 0) { return arr[0]; } else { return sum(arr, n - 1) + arr[n]; } // Only change code above this line } ```