为何JavaScript递归函数countup输出递增序列而非递减?
为什么递归函数countup输出递增序列而非递减序列?
我们来拆解这段递归代码的执行流程,就能明白结果递增的原因:
递归的两个核心阶段:调用与回溯
你的代码逻辑是先递归调用,再修改数组,这会导致元素按从小到大的顺序被添加到数组中:
递归调用阶段:
调用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),返回空数组[]。回溯阶段:
从最底层往回执行所有暂停的函数: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
相关产品推荐
相关产品推荐

