Проблема в том, что вы не передаете массив рекурсивному вызову, поэтому при каждом рекурсивном выполнении создается новый пустой массив. Как следствие, он не возвращает массив, в который было добавлено значение, а новый, пустой, который возвращается после рекурсивных вызовов.
Во-вторых, вы никогда не будете pu sh значение 1 в массив. Так что было бы лучше остановить рекурсию на 0 вместо 1.
Итак, взяв эти два исправления, вы получите следующее:
function countdown(n, newArr=[]) {
if (n <= 0) {
return newArr;
}
newArr.push(n);
return countdown(n - 1, newArr)
}
console.log(countdown(5));
Ваше альтернативное решение чисто, потому что ему не нужно передавать массив в качестве аргумента. Он использует возвращенный массив, чтобы добавить к нему следующее значение (перед ним). Это было бы моим предпочтением.
Чтобы понять, как это работает, выведите промежуточные значения:
function countdown(n) {
if (n < 1) {
console.log("At the end of recursion. Creating and returning an empty array.");
return [];
} else {
const arr = countdown(n - 1);
console.log("Got the following array back from the recursive call:");
console.log(JSON.stringify(arr));
arr.unshift(n);
console.log("Prefixing it with " + n + " and returning the result:");
console.log(JSON.stringify(arr));
return arr;
}
}
var result = countdown(5);