递归入门疑问:JS countup函数输出为何与预期顺序相反?
递归函数
countup执行过程与输出解析 你的困惑在于没搞清楚递归的**"递推-回溯"执行顺序**:这个函数会先一路递归到终止条件(base case),再从最底层往回执行push操作,所以最终是升序数组,而非你预想的降序。
逐步骤拆解执行流程
我们从countup(5)开始,一步步跟踪每一层递归的执行:
1. 递推阶段(逐层深入到终止条件)
- 调用
countup(5):n=5≥1,先执行const countArray = countup(4),此时push(5)暂不执行,进入下一层递归。 - 调用
countup(4):n=4≥1,先执行const countArray = countup(3),push(4)暂不执行,进入下一层。 - 调用
countup(3):n=3≥1,先执行const countArray = countup(2),push(3)暂不执行,进入下一层。 - 调用
countup(2):n=2≥1,先执行const countArray = countup(1),push(2)暂不执行,进入下一层。 - 调用
countup(1):n=1≥1,先执行const countArray = countup(0),push(1)暂不执行,进入下一层。 - 调用
countup(0):触发base case(n<1),直接返回空数组[]。
2. 回溯阶段(从底层往回执行剩余代码)
现在开始从最底层的递归结果往回处理:
- 回到
countup(1):countArray现在是[],执行countArray.push(1),数组变成[1],返回这个数组。 - 回到
countup(2):countArray是[1],执行push(2),数组变成[1,2],返回。 - 回到
countup(3):countArray是[1,2],执行push(3),数组变成[1,2,3],返回。 - 回到
countup(4):countArray是[1,2,3],执行push(4),数组变成[1,2,3,4],返回。 - 回到
countup(5):countArray是[1,2,3,4],执行push(5),数组变成[1,2,3,4,5],返回这个数组。
最终console.log(countup(5))就输出了[1,2,3,4,5]。
如何得到你预想的降序数组?
如果要输出[5,4,3,2,1],需要调整执行顺序:先把当前n加入数组,再递归拼接后续结果,比如:
function countdown(n) { if (n < 1) { return []; } else { const countArray = [n]; // 先放当前n,再拼接递归返回的数组 countArray.push(...countdown(n - 1)); return countArray; } } console.log(countdown(5)); // 输出[5,4,3,2,1]
内容的提问来源于stack exchange,提问作者xaviour1504
相关产品推荐
相关产品推荐

