为什么此JS函数以升序而不是降序返回数字?

时间:2019-12-16 13:08:55

标签: 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添加为数组中的第一个元素。然后随着(n-1)的累加运行,将n-1添加为数组中的第二个元素,并且该过程不断重复。但在那种情况下,最终数组中的数字应为[n,n-1,n-2,....,3,2,1],但实际结果是该数组:[1,2,3, ...,n-2,n-1,n]。为什么/如何以这种方式发生与它应如何表现相反的行为?

2 个答案:

答案 0 :(得分:1)

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

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,然后堆栈会展开并添加每个连续的数字。

答案 1 :(得分:0)

您可以使用javascript的排序功能对数组进行排序。

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

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