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

FreeCodeCamp递归倒计时题:为何打印顺序是1,2,3,4,5而非倒序?

递归倒计时输出顺序异常原因

问题根因

你将递归调用语句countdown(n-1)放在了打印、数组插入操作的前面,所有对n的操作都要等内层递归完全执行完毕才会触发,最终执行顺序就是从小到大。

具体执行流程(以入参n=5为例)

  • 调用countdown(5),n≥1判定成立,优先执行countdown(4),当前层级剩余的console.log(5)、a.push(5)操作暂停等待
  • 进入countdown(4)执行逻辑,同样优先调用countdown(3),当前层级操作暂停
  • 重复以上逻辑直到调用countdown(0),触发else分支返回空数组,内层递归全部执行完毕进入回溯阶段
  • 回溯先回到最近的countdown(1)执行上下文,执行暂停的操作:打印1,将1插入数组a,返回a
  • 回溯到countdown(2)执行上下文,执行暂停的操作:打印2,将2插入数组a,返回a
  • 以此类推直到回溯到countdown(5)执行完毕,最终打印顺序就是1、2、3、4、5,最终数组也为正序排列

修复方案

如果要得到倒序结果,只需要把当前n的操作放到递归调用之前即可:

var a=[];
// Only change code below this line
function countdown(n){
  if(n>=1){
    console.log(n);
    a.push(n);
    countdown(n-1);
    return a;
  }
  else{
    return [];
  }
}
console.log(countdown(5));

优化建议

你当前使用全局变量存储结果会出现多次调用函数结果污染的问题,可以改成无全局变量的递归写法:

function countdown(n){
  return n >= 1 ? [n, ...countdown(n-1)] : []
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:45:01