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
相关产品推荐
相关产品推荐

