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

JavaScript递归函数疑问解析:countup与countdown执行逻辑

递归倒计时函数的疑问解答

涉及代码

countup函数:

function countup(n){
    if (n < 1){
        return [];
    } else {
        const countArray = countup(n - 1);
        countArray.push(n);
        return countArray
    }
};
console.log(countup(5)); //[1, 2, 3, 4, 5]

countdown函数:

console.log("\nrecursive")
function countdown(n){
    if (n < 1){
        return []
    } else {
        const array = countdown(n - 1);
        array.unshift(n)  //unshift() add to the beginning of an array
        return array  
    }
};
console.log(countdown(5)); //[ 5, 4, 3, 2, 1 ]

1. countup函数中const countArray = countup(n - 1)为何使用n-1?和索引从0开始有关吗?

使用n-1是递归的核心逻辑:每次调用都将问题规模缩小1,直到触发终止条件n < 1(返回空数组)。这和数组索引从0开始没有关系,目的是让递归逐步"递"到最底层的终止条件,之后再开始"归"的过程执行后续的数组操作。

2. 为什么countup用push得到的是[1,2,3,4,5],而非预期的[5,4,3,2,1]?

递归的执行顺序是先"递"后"归":

  • 调用countup(5)时,会先依次调用countup(4)、countup(3)、countup(2)、countup(1),直到countup(0)返回空数组[]。
  • 之后开始回溯执行push操作:
    • 回到countup(1):countArray是[],push(1)得到[1]并返回;
    • 回到countup(2):countArray是[1],push(2)得到[1,2]并返回;
    • 以此类推,直到回到countup(5)时,push(5)得到[1,2,3,4,5]。
      因为push是在回溯阶段从1到5依次执行,所以最终数组是升序。

3. countdown函数用unshift得到[5,4,3,2,1]的执行逻辑

同样遵循先"递"后"归"的顺序:

  • 调用countdown(5)时,先递到countdown(0)返回空数组[];
  • 开始回溯执行unshift操作:
    • 回到countdown(1):array是[],unshift(1)得到[1]并返回;
    • 回到countdown(2):array是[1],unshift(2)得到[2,1]并返回;
    • 回到countdown(3):unshift(3)得到[3,2,1];
    • 回到countdown(4):unshift(4)得到[4,3,2,1];
    • 回到countdown(5):unshift(5)得到[5,4,3,2,1]。
      unshift是往数组开头添加元素,回溯时从1到5依次往开头插入,最终得到降序数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:12:27