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

