繁体   English   中英

关于递归 JS 的问题 - 来自 freecodecamp

[英]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 < 10返回空数组的点。

接下来,我们遇到第一个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 我们当前的ncountArray的变量名:

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.

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