javascript - 为什么这个 JS 函数按升序而不是降序返回数字?

标签 javascript recursion

我是一名学习编码的学生,通过 freeCodeCamp 练习来学习 JS。我在解释递归的练习之一中遇到了这个函数。从我看来合乎逻辑的是,该函数应该将数字从 1 到 n 按降序排列在数组中,但在执行时,它会按升序排列数字!为什么/怎么会发生这种情况? JS 是否以除自上而下之外的其他方式执行它,还是我在这里遗漏了一些东西?

function countup(n) {
  if (n < 1) {
    return [];
  } else {
    const countArray = countup(n - 1);
    countArray.push(n);
    return countArray;
  }
}
console.log(countup(15));

从代码来看,代码似乎是这样做的:将常量 countArray 定义为 countup(n-1),然后将 n 添加为数组中的第一个元素。然后随着 countup 的运行,将 (n-1) 添加 n-1 作为数组中的第二个元素,并且该过程不断重复。但在这种情况下,最终数组中的数字应该是 [n, n-1, n-2, .... , 3, 2, 1] 但实际结果是这个数组: [1,2,3, ...,n-2,n-1,n]。为什么/如何会以与它应该表现的方式相反的方式发生?

最佳答案

您需要考虑递归调用期间会发生什么。也许这会有所帮助:

countup(3)
  - calls countup(2)
      - calls countup(1)
          - calls countup(0) - this returns [] right away
          - sets countArray to []
          - pushes 1 onto the array  <--- first number pushed
          - returns [1]
      - sets countArray to [1]
      - pushes 2 onto the array
      - returns [1,2]
  - sets countArray to [1,2]
  - pushes 3 onto the array
  - returns [1,2,3]           

正如您所看到的,第一次实际将数字压入数组时是当它减到 1 时,然后堆栈展开添加每个连续的数字。

关于javascript - 为什么这个 JS 函数按升序而不是降序返回数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59357287/

相关文章:

javascript - 打破一个闭包来向外行解释它

javascript - 如何使用 NodeJS 将 PDF 转换为 DOCX 或 URL 转换为 DOCX?

javascript - 如何在聊天中添加滚动条?

javascript - 在 Internet Explorer 11 中加载巨大的数组导致堆栈溢出

javascript - 通过动态数组递归

c - C中的Seg故障链表递归

recursion - 提取列表中的两个元素并递归传递其余元素

javascript - Angular 2上传图片按钮正在刷新页面

recursion - 使用递归时如何计算列表(或嵌套列表的列表)中的所有原子

c - 使用 C 查找多个用户输入值的 gcd