diff --git a/curriculum/challenges/_meta/basic-javascript/meta.json b/curriculum/challenges/_meta/basic-javascript/meta.json index 568e2d9633..2e9185d571 100644 --- a/curriculum/challenges/_meta/basic-javascript/meta.json +++ b/curriculum/challenges/_meta/basic-javascript/meta.json @@ -440,13 +440,13 @@ "587d7b7e367417b2b2512b21", "Use Multiple Conditional (Ternary) Operators" ], - [ - "5cc0bd7a49b71cb96132e54c", - "Use Recursion to Create a Range of Numbers" - ], [ "5cd9a70215d3c4e65518328f", "Use Recursion to Create a Countdown" + ], + [ + "5cc0bd7a49b71cb96132e54c", + "Use Recursion to Create a Range of Numbers" ] ], "helpRoom": "HelpJavaScript", diff --git a/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md index 08d1534e29..3b9d5ab89e 100644 --- a/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md +++ b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md @@ -8,15 +8,34 @@ forumTopicId: 305925 ## Description
-Continuing from the previous challenge, we provide you another opportunity to create a recursive function to solve a problem. +In a [previous challenge](/learn/javascript-algorithms-and-data-structures/basic-javascript/replace-loops-using-recursion), you learned how to use recursion to replace a for loop. Now, let's look at a more complex function that returns an array of consecutive integers starting with 1 through the number passed to the function. + +As mentioned in the previous challenge, there will be a base case. The base case tells the recursive function when it no longer needs to call itself. It is a simple case where the return value is already known. There will also be a recursive call which executes the original function with different arguments. If the function is written correctly, eventually the base case will be reached. + +For example, say you want to write a recursive function that returns an array containing the numbers 1 through n. This function will need to accept an argument, n, representing the final number. Then it will need to call itself with progressively smaller values of n until it reaches 1. You could write the function as follows: + +```javascript +function countup(n) { + if (n < 1) { + return []; + } else { + const countArray = countup(n - 1); + countArray.push(n); + return countArray; + } +} +console.log(countup(5)); // [ 1, 2, 3, 4, 5 ] +``` + +At first, this seems counterintuitive since the value of `n` decreases, but the values in the final array are increasing. This happens because the push happens last, after the recursive call has returned. At the point where `n` is pushed into the array, `count(n - 1)` has already been evaluated and returned `[1, 2, ..., n - 1]`.
## Instructions
-We have defined a function called countdown with two parameters. The function should take an array in the myArray parameter and append the numbers n through 1 based on the n parameter. -For example, calling this function with n = 5 will pad the array with the numbers [5, 4, 3, 2, 1] inside of it. +We have defined a function called countdown with one parameter (n). The function should use recursion to return an array containing the integers n through 1 based on the n parameter. If the function is called with a number less than 1, the function should return an empty array. +For example, calling this function with n = 5 should return the array [5, 4, 3, 2, 1]. Your function must use recursion by calling itself and must not use loops of any kind.
@@ -26,13 +45,13 @@ Your function must use recursion by calling itself and must not use loops of any ``` yml tests: - - text: After calling countdown(myArray, -1), myArray should be empty. - testString: assert.isEmpty(padArray([], -1)); - - text: After calling countdown(myArray, 10), myArray should contain [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] - testString: assert.deepStrictEqual(padArray([], 10), [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]); - - text: After calling countdown(myArray, 5), myArray should contain [5, 4, 3, 2, 1] - testString: assert.deepStrictEqual(padArray([], 5), [5, 4, 3, 2, 1]); - - 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.). + - text: countdown(-1) should return an empty array. + testString: assert.isEmpty(countdown(-1)); + - text: countdown(10) should return [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] + testString: assert.deepStrictEqual(countdown(10), [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]); + - text: countdown(5) should return [5, 4, 3, 2, 1] + testString: assert.deepStrictEqual(countdown(5), [5, 4, 3, 2, 1]); + - text: Your code should not rely on any kind of loops (for, while or higher order functions such as forEach, map, filter, and 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(countdown.toString()).match(/countdown\s*\(.+\)\;/)); @@ -49,10 +68,10 @@ tests: //Only change code below this line -function countdown(myArray, n){ +function countdown(n){ return; } - +console.log(countdown(5)); // [5, 4, 3, 2, 1] ``` @@ -62,11 +81,6 @@ function countdown(myArray, n){ ```js const removeJSComments = str => str.replace(/\/\*[\s\S]*?\*\/|\/\/.*$/gm, ''); -function padArray(arr, n){ - countdown(arr, n); - return arr; -} - ``` @@ -78,14 +92,8 @@ function padArray(arr, n){ ```js //Only change code below this line -function countdown(myArray, n){ - if(n <= 0){ - return; - } - else{ - myArray.push(n); - countdown(myArray, n - 1); - } +function countdown(n){ + return n < 1 ? [] : [n].concat(countdown(n - 1)); } ``` diff --git a/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-range-of-numbers.english.md b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-range-of-numbers.english.md index 05b47d3c82..d0bada33b6 100644 --- a/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-range-of-numbers.english.md +++ b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-range-of-numbers.english.md @@ -8,25 +8,7 @@ forumTopicId: 301180 ## Description
-In a [previous challenge](/learn/javascript-algorithms-and-data-structures/basic-javascript/replace-loops-using-recursion), you learned how to use recursion to replace a for loop. Now, let's look at a more complex function that returns an array of consecutive integers starting with 1 through the number passed to the function. - -As mentioned in the previous challenge, there will be a base case. The base case tells the recursive function when it no longer needs to call itself. It is a simple case where the return value is already known. There will also be a recursive call which executes the original function with different arguments. If the function is written correctly, eventually the base case will be reached. - -For example, say you want to write a recursive function that returns an array containing the numbers 1 through n. This function will need to accept an argument n representing the final number. Then it will need to call itself with progressively smaller values of n until it reaches 1. You could write the function as follows: - -```js -function count(n) { - if (n === 1) { - return [1]; - } else { - var numbers = count(n - 1); - numbers.push(n); - return numbers; - } -} -``` - -At first this is counterintuitive since the value of `n` decreases, but the values in the final array are increasing. This happens because the push happens last, after the recursive call has returned. At the point where `n` is pushed into the array, `count(n - 1)` has already been evaluated and returned `[1, 2, ..., n - 1]`. +Continuing from the previous challenge, we provide you another opportunity to create a recursive function to solve a problem.