繁体   English   中英

你能为我解释一下这个 JavaScript function 吗?

[英]Can you explain this JavaScript function for me?

 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 ]

你们能否向我解释一下这个 function 是如何工作的,以及变量“countArray”何时会将元素推送到数组中。

它是一个递归 function ,它将从1n的所有数字放入一个数组中。 让我们看一下n = 5的示例:

你输入 function 并检查n是否小于1 ,因为不是这种情况,你跳到 else 语句,其中数组countArray用 countup countup(n - 1)的值初始化,因此你从头开始function,但n = 4

这会发生多次,直到n0 ,在这种情况下,第一个 if 语句为真。 通过此退出条件,function 返回一个空数组,该数组被分配给前一个递归“层”中 function 调用中的变量countArray 之后,将该“层”上等于1的变量n推入数组中。 最后这些步骤也会发生多次,因为countArray返回到递归 function 的下一次调用,与返回空数组的方式相同。

在执行所有递归 function 调用后,返回结果数组[1,2,3,4,5]

这个 function 将首先检查变量n < 1

如果它更大,它将以n-1自行运行

If n is 0 , the function will return an empty Array and will go one "layer" back to the last function countup countup(1) It will now add n (1) to the countArray and return this Array to the "last" function Now function countup countup(2)已在其countArray中收到数字1 ,它将返回此数字。 [1, 2]

它将重复此过程,直到达到“最后一个”/“第一个” function ( countup countup(5) ) 并将返回包含所有数字[1, 2, 3, 4, 5]countArray

要理解递归,有时您需要手动跟踪代码的执行。 现在下面的行导致递归调用并从数字中减一,然后将其传递给递归调用。

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。

很多时候,递归可以被循环代替,但情况并非总是如此。 作为一名程序员,应该意识到这个重要的话题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM