[英]Question about recursive JS - from freecodecamp
有这个function:
function countup(n) { if (n < 1) { return []; } else { const countArray = countup(n - 1); countArray.push(n); return countArray; } } console.log(countup(5));
[] 是如何被先推送的? 从代码看,好像是从 n 开始倒计时。 有人可以解释吗?
额外的问题:当我可以写时为什么要这样写:
function countup(n){ let answer = [] for (let i = 1; i <= n; i++){ (i<n)? answer.push(i): answer.push(n) } return answer } console.log(countup(5));
这是一个较短的 function。 先感谢您!
即使数字从n
开始按降序排列,它们实际上是首先被推入最小的数字。 这是因为在push()
操作发生之前,当我们在递归的每一层调用countup(n - 1)
时,我们一直在递归堆栈中下降。 这就是为什么我们会达到n < 1
即0
返回空数组的点。
接下来,我们遇到第一个array.push()
操作,因此推入数组的第一个数字实际上是 1 而不是n
。 接下来,递归层开始结束,我们将数字 2、3 等推入n
。
是的,您可以使用传统的 for 循环实现相同的目的,但我想他们只是想解释递归的工作原理。
要理解递归,有时您需要手动跟踪代码的执行。 现在下面的行导致递归调用并从数字中减一,然后将其传递给递归调用。
const countArray = countup(n - 1);
现在想象一下,如果您将5
传递给最初的 function 调用,如下所示:
countup(5);
由于 5 不小于 1, else
块将被执行。 else
块中的第一行是递归调用。 因此,当您的程序遇到递归调用时,它会停止当前 function 的执行,直到该递归 function 调用结束/返回。 所以第一个递归调用将是:
const countArray = countup(4);
因此,将重复相同的过程,直到n
等于 0。由于0
小于 1, if
条件将评估为true
。 它将返回一个empty array
。
递归调用后,将数字推送到递归调用返回的数组中。 所以该点的数组将包含[0]
然后[0, 1]
并且它将继续添加数字,直到计算出所有递归调用,然后它将执行初始 function 调用的 rest。
很多时候,递归可以被循环代替,但情况并非总是如此。 作为一名程序员,应该意识到这个重要的话题。
由于countup()
完全除以依赖于n
的 if 语句,让我们首先看看n
的不同值执行什么。
为了更容易理解,我们将 append 我们当前的n
到countArray
的变量名:
n == 5:
const countArray5 = countup(4);
countArray5.push(5);
return countArray5;
⋮
n == 1:
const countArray1 = countup(0);
countArray1.push(1);
return countArray1;
n == 0:
return [];
现在让我们依次展开对countup(n)
的每个内部调用:
countup(5) {
const countArray5 = countup(4);
countArray5.push(5);
return countArray5;
}
countup(5) {
const countArray5 = countup(4) {
const countArray4 = countup(3);
countArray4.push(4);
return countArray4;
};
countArray5.push(5);
return countArray5;
}
展开直到countup(0)
:
countup(5) {
const countArray5 = countup(4) {
const countArray4 = countup(3) {
const countArray3 = countup(2) {
const countArray2 = countup(1) {
const countArray1 = countup(0) // countup(0) returns [] so countArray1 = [];
countArray1.push(1); // Then push '1' to countArray1;
return countArray1; // Return [1] at counterArray2 = countup(1) above
};
countArray2.push(2); // countArray2 was [1], now push '2' to make it [1,2]
return countArray2; // Return [1,2] at countArray3 = countup(2) above
};
countArray3.push(3); // Push '3' to countArray3 => [1,2,3]
return countArray3; // return [1,2,3] at countArray4 = countup(3)
};
countArray4.push(4); // Push '4' to countArray4 => [1,2,3,4]
return countArray4; // Return [1,2,3,4] at countArray5 = countup(4)
};
countArray5.push(5); // Push '5' to countArray5 => [1,2,3,4,5]
return countArray5; // countup(5) returns [1,2,3,4,5]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.