这是FreeCodeCamp上此exercice的解决方案
function countdown(n) {
if (n < 1) {
return [];
} else {
const arr = countdown(n - 1);
arr.unshift(n);
return arr;
}
}
我了解递归的概念。我知道函数倒数将一直重复到n <1,并且一旦对n的所有可能值都进行求值,将执行以下命令arr.unshift(n)。让我感到烦恼的是,我不知道const arr何时以及如何成为数组。
答案 0 :(得分:0)
让我感到烦恼的是,我什么时候不知道const arr的时间或方式, 数组。
看基本情况是否返回一个空数组?这就是一切的开始,这要归功于一旦代码从递归调用中返回,您就可以继续处理数组结构。
代码说明
Unshift会将LIFO附加在第零个索引上,
最后一个是1,它将被添加到数组中,之后数组将在第0个索引处添加数字2,在第二个索引处您将添加数字1,在第3个数字将添加在第0个位置索引,第二个索引将是数字2,最后一个索引将包含数字1。现在您将看到模式...
尝试在两者之间进行console.log登录
function countDown(n) {
if (n < 1) {
return [];
} else {
const countArray = countDown(n - 1);
console.log(n)
countArray.unshift(n);
return countArray;
}
}
console.log(countDown(5));
如果您更习惯于ES6 +语法,请在数组的第一个位置添加第一个元素n,然后对其余元素进行解构。
function countDown(n) {
if (n < 1) {
return [];
} else {
const countArray=[n,...countDown(n - 1)];
return countArray;
}
}
console.log(countDown(5));
最后,您可以将其与三元运算符一起使用:
const countDown = (n) => n < 1 ? [] : [n, ...countDown(n - 1)];
console.log(countDown(5));
答案 1 :(得分:0)
让我们遵循一个相对简单的呼叫模式。这又是函数:
function countdown(n) {
if (n < 1) {
return [];
} else {
const arr = countdown(n - 1);
arr.unshift(n);
return arr;
}
}
假设您致电countdown(2)
:
1a)n不小于1
1b)初始化arr并将其设置为countdown(1)
2a)n不小于1
2b)初始化arr并将其设置为countdown(0)
3a)n小于1
3b)一个空数组返回到循环2
arr是[]
2c)arr.unshift将数字2添加到数组的开头。
arr是[2]
2d)arr返回到循环1
1c)arr.unshift将数字1加到数组的开头。
数组为[1,2]
1d)arr返回到函数调用
因此,如果您写了let result = countdown(2)
和console.log(result)
,则会得到:[1,2]
让我感到烦恼的是,我什么时候不知道const arr的时间或方式, 数组。
查看步骤3b,2b和2c:
3b) an empty array is returned to loop 2
2b) an arr is initialized and set to countdown(0)
2c) arr.unshift adds the number 2 to the start of the array.
将一个空数组设置为const arr
,然后将数字2添加到该数组。
现在看步骤2d和1c:
2d) arr is returned to loop 1
1c) arr.unshift adds the number 1 to the start of the array.
该数组设置为像这样的{strong> new 数组(const arr = [2]
),并将数字1添加到该数组。最终在1d中,该新数组返回到调用该函数的表达式中。对于每个递归循环,您都有类似以下内容:
const arr = something
new const arr = old const arr