Hi @TheOctagon3323,
why does it push it 5 times, I guess it should be stored somewhere.
JS uses 2 abstractions for that:
- nested (function) calls
- call stack
I wrote a short faq
about recursion using the exercise:
Use Recursion to Create a Range of Numbers
[0]
code
function rangeOfNumbers(startNum, endNum) {
if(startNum === endNum) {
return [endNum];
} else {
let arr = rangeOfNumbers(startNum + 1, endNum);
arr.push(startNum);
return arr;
}
}
let result = rangeOfNumbers(1,4);
console.log(result);
// [ 4, 3, 2, 1 ]
1.- What happens when the base case is evaluated as false?
The function calls itself:
Steps: 4,6,8
2.- What happens when the base case is evaluated as true?
Returns an array:
Step: 10
3.- The Array, where does it come from?
From the base case:
Step: 10
4.- Why can I push startNum to arr?
Because after the base case is evaluated as true, arr is an array:
Step: 11
5.- Why I’m Getting [4,3,2,1] ?
Because JavaScript uses a “stack” (LIFO, last in first out):
Steps: 10, 13, 16, 19
6.- How can I get [1,2,3,4]?
Replace push
with unshift
function rangeOfNumbers(startNum, endNum) {
if(startNum === endNum) {
return [endNum];
} else {
let arr = rangeOfNumbers(startNum + 1, endNum);
arr.unshift(startNum); // <- here
return arr;
}
}
let result = rangeOfNumbers(1,4);
console.log(result);
// [ 1, 2, 3, 4 ]
7.- Related topics:
- nested (function) calls
- call stack
Cheers and happy coding 
NOTES:
[0] https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-range-of-numbers
[1] You can use python tutor
to see step by step how the function is executed:
https://pythontutor.com/live.html#mode=edit
[2] A demo of python tutor
:
[3] I also wrote a blog post (it has 27 images)
https://diegoperezm.github.io/blog/recursion.html
[4] If you know spanish, I recorded a video explaining the exercise step by step: