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

递归入门疑问:JS countup函数输出为何与预期顺序相反?

递归函数countup执行过程与输出解析

你的困惑在于没搞清楚递归的**"递推-回溯"执行顺序**:这个函数会先一路递归到终止条件(base case),再从最底层往回执行push操作,所以最终是升序数组,而非你预想的降序。

逐步骤拆解执行流程

我们从countup(5)开始,一步步跟踪每一层递归的执行:

1. 递推阶段(逐层深入到终止条件)

  • 调用countup(5):n=5≥1,先执行const countArray = countup(4),此时push(5)暂不执行,进入下一层递归。
  • 调用countup(4):n=4≥1,先执行const countArray = countup(3),push(4)暂不执行,进入下一层。
  • 调用countup(3):n=3≥1,先执行const countArray = countup(2),push(3)暂不执行,进入下一层。
  • 调用countup(2):n=2≥1,先执行const countArray = countup(1),push(2)暂不执行,进入下一层。
  • 调用countup(1):n=1≥1,先执行const countArray = countup(0),push(1)暂不执行,进入下一层。
  • 调用countup(0):触发base case(n<1),直接返回空数组[]。

2. 回溯阶段(从底层往回执行剩余代码)

现在开始从最底层的递归结果往回处理:

  • 回到countup(1):countArray现在是[],执行countArray.push(1),数组变成[1],返回这个数组。
  • 回到countup(2):countArray是[1],执行push(2),数组变成[1,2],返回。
  • 回到countup(3):countArray是[1,2],执行push(3),数组变成[1,2,3],返回。
  • 回到countup(4):countArray是[1,2,3],执行push(4),数组变成[1,2,3,4],返回。
  • 回到countup(5):countArray是[1,2,3,4],执行push(5),数组变成[1,2,3,4,5],返回这个数组。

最终console.log(countup(5))就输出了[1,2,3,4,5]。

如何得到你预想的降序数组?

如果要输出[5,4,3,2,1],需要调整执行顺序:先把当前n加入数组,再递归拼接后续结果,比如:

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:55:14