diff --git a/curriculum/challenges/_meta/basic-javascript/meta.json b/curriculum/challenges/_meta/basic-javascript/meta.json index 5b0745d889d..d9a96532026 100644 --- a/curriculum/challenges/_meta/basic-javascript/meta.json +++ b/curriculum/challenges/_meta/basic-javascript/meta.json @@ -404,6 +404,10 @@ "5a2efd662fb457916e1fe604", "Iterate with JavaScript Do...While Loops" ], + [ + "5cfa3679138e7d9595b9d9d4", + "Replace Loops using Recursion" + ], [ "5688e62ea601b2482ff8422b", "Profile Lookup" @@ -439,4 +443,4 @@ ], "helpRoom": "HelpJavaScript", "fileName": "02-javascript-algorithms-and-data-structures/basic-javascript.json" -} \ No newline at end of file +} 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 new file mode 100644 index 00000000000..deef538336c --- /dev/null +++ b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/replace-loops-using-recursion.english.md @@ -0,0 +1,108 @@ +--- +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/' +--- + +## 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 first n elements in an array to create the product of the 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 creates the sum of the first n elements of 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 +} + +``` + +