JavaScript递归countup函数执行逻辑与返回结果排序疑问
递归函数countup执行逻辑解释
你提到的JS代码如下:
function countup(n) { if (n < 1) { return []; } else { const countArray = countup(n - 1); countArray.push(n); return countArray; } } console.log(countup(5));
递归执行分递和归两个阶段,你之前的理解只覆盖了「递」的阶段,结果正序的核心逻辑发生在「归」的阶段,完整执行流程如下:
第一阶段:递(逐层调用,直到触发终止条件)
- 调用
countup(5),n=5不满足n<1的终止条件,需要先等countup(4)执行完成返回结果,才能继续执行后续赋值、push逻辑 - 调用
countup(4),n=4不满足终止条件,先执行countup(3) - 调用
countup(3),n=3不满足终止条件,先执行countup(2) - 调用
countup(2),n=2不满足终止条件,先执行countup(1) - 调用
countup(1),n=1不满足终止条件,先执行countup(0) - 调用
countup(0),n=0满足n<1,直接返回空数组[]
第二阶段:归(从最深层逐层向外返回,执行每层剩余的逻辑)
- 回到
countup(1)的执行上下文:countArray拿到下层返回的[],执行countArray.push(1),数组变为[1],返回该数组 - 回到
countup(2)的执行上下文:countArray拿到下层返回的[1],执行countArray.push(2),数组变为[1,2],返回该数组 - 回到
countup(3)的执行上下文:countArray拿到下层返回的[1,2],执行countArray.push(3),数组变为[1,2,3],返回该数组 - 回到
countup(4)的执行上下文:countArray拿到下层返回的[1,2,3],执行countArray.push(4),数组变为[1,2,3,4],返回该数组 - 回到
countup(5)的执行上下文:countArray拿到下层返回的[1,2,3,4],执行countArray.push(5),数组变为[1,2,3,4,5],返回该数组
最终console.log输出的就是正序数组[1,2,3,4,5]。
你之前的误区是误以为push操作会在调用下层递归前执行,但实际上push是在拿到下层递归的返回结果后才执行的,所以更小的数字会先被推入数组,最终结果就是正序排列。
内容的提问来源于stack exchange,提问作者Ex0dist
相关产品推荐
相关产品推荐

