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.