You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JavaScript递归函数countup输出递增序列而非递减?

为什么递归函数countup输出递增序列而非递减序列?

我们来拆解这段递归代码的执行流程,就能明白结果递增的原因:

递归的两个核心阶段:调用与回溯

你的代码逻辑是先递归调用,再修改数组,这会导致元素按从小到大的顺序被添加到数组中:

  1. 递归调用阶段:
    调用countup(5)时,函数会先执行countup(n-1)即countup(4),此时countup(5)的执行暂停,等待countup(4)的返回结果。
    同理,countup(4)调用countup(3)并暂停,countup(3)调用countup(2)暂停……直到countup(0)调用countup(-1)。
    当n=-1时,触发终止条件if(n < 0),返回空数组[]。

  2. 回溯阶段:
    从最底层往回执行所有暂停的函数:

    • countup(0)拿到countup(-1)返回的[],执行push(0),返回[0]给countup(1)。
    • countup(1)拿到[0],执行push(1),返回[0, 1]给countup(2)。
    • countup(2)拿到[0, 1],执行push(2),返回[0, 1, 2]给countup(3)。
    • 以此类推,直到countup(5)拿到[0,1,2,3,4],执行push(5),最终返回[0,1,2,3,4,5]。

(注:你提到实际输出是[1,2,3,4,5],大概率是代码终止条件被调整为n <= 0返回空数组,但核心逻辑一致)

如何改成递减序列?

如果想要得到[5,4,3,2,1],需要把当前的n放在数组前面,而非后面,两种常见写法:

方法1:用unshift替代push

function countdown(n) {
  if (n <= 0) { // 调整终止条件,避免包含0
    return [];
  } else {
    const countArray = countdown(n - 1);
    countArray.unshift(n); // 将当前n插入数组开头
    return countArray;
  }
}
console.log(countdown(5)); // 输出 [5,4,3,2,1]

方法2:直接拼接数组

function countdown(n) {
  if (n <= 0) {
    return [];
  } else {
    // 先放当前n,再拼接递归返回的后续数组
    return [n].concat(countdown(n - 1));
  }
}
console.log(countdown(5)); // 输出 [5,4,3,2,1]

内容的提问来源于stack exchange,提问作者Tal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 08:30:36