diff --git a/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/replace-loops-using-recursion.english.md b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/replace-loops-using-recursion.english.md index 0106910d68..0cf58778f4 100644 --- a/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/replace-loops-using-recursion.english.md +++ b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/replace-loops-using-recursion.english.md @@ -8,31 +8,31 @@ 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: +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 first n elements of 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++) { + var product = 1; + for (var i = 0; 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. +However, notice that multiply(arr, n) == multiply(arr, n - 1) * arr[n - 1]. 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]; + return 1; } else { - return multiply(arr, n - 1) * arr[n]; + return multiply(arr, n - 1) * arr[n - 1]; } } ``` -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. +The recursive version of multiply breaks down like this. In the base case, where n <= 0, it returns 1. 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. @@ -41,7 +41,7 @@ The recursive version of multiply breaks down like this. In the -Write a recursive function, sum(arr, n), that returns the sum of the elements from 0 to n inclusive in an array arr. +Write a recursive function, sum(arr, n), that returns the sum of the first n elements of an array arr.
@@ -50,10 +50,12 @@ Write a recursive function, sum(arr, n), that returns the sum of th ``` 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: sum([1], 0) should equal 0. + testString: assert.equal(sum([1], 0), 0); + - text: sum([2, 3, 4], 1) should equal 2. + testString: assert.equal(sum([2, 3, 4], 1), 2); + - text: sum([2, 3, 4, 5], 3) should equal 9. + testString: assert.equal(sum([2, 3, 4, 5], 3), 9); - 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. @@ -97,9 +99,9 @@ const removeJSComments = str => str.replace(/\/\*[\s\S]*?\*\/|\/\/.*$/gm, ''); function sum(arr, n) { // Only change code below this line if(n <= 0) { - return arr[0]; + return 0; } else { - return sum(arr, n - 1) + arr[n]; + return sum(arr, n - 1) + arr[n - 1]; } // Only change code above this line }