关于JS递归函数printRangeUpDown反向打印逻辑的技术咨询
理解递归中反向打印的原理
嘿,这个问题的核心其实是搞懂递归调用栈的执行顺序,我给你一步步拆解清楚:
首先先把你的代码贴出来方便对照:
var printRangeUpDown = function(min, max) { if (min === max) { console.log('condition met ' + min); return } console.log('low to high ' + min); printRangeUpDown(min + 1, max); console.log('high to low ' + min); }; printRangeUpDown(4, 10);
递归调用栈的核心逻辑
递归的本质是函数反复调用自己,而每次函数调用都会被加入到调用栈中——栈的特点是「后进先出」(LIFO),简单说就是最后被压进去的函数,会最先执行完并弹出栈。我们跟着执行流程走一遍:
第一步:逐层压栈,执行升序打印
- 第一次调用
printRangeUpDown(4,10):4≠10,先执行console.log('low to high ' + 4)(输出4),然后调用printRangeUpDown(5,10),此时当前函数(4→10)的执行被暂停,等待新调用完成。 - 接着调用
printRangeUpDown(5,10):5≠10,执行console.log('low to high ' +5)(输出5),再调用printRangeUpDown(6,10),当前函数暂停。 - 这个过程一直重复,直到调用
printRangeUpDown(10,10):触发终止条件,执行console.log('condition met ' +10)(输出10),然后return,这个函数执行完毕,从调用栈中弹出。
- 第一次调用
第二步:逐层出栈,执行降序打印
- 现在回到上一个暂停的函数
printRangeUpDown(9,10):它之前执行到了递归调用那一步,现在递归调用已经完成,所以继续执行后面的console.log('high to low ' +9)(输出9),然后这个函数执行完毕,弹出栈。 - 接着回到
printRangeUpDown(8,10),执行后续的console.log('high to low ' +8)(输出8),弹出栈。 - 以此类推,直到回到最开始的
printRangeUpDown(4,10),执行最后的console.log('high to low ' +4)(输出4)。
- 现在回到上一个暂停的函数
一句话总结
- 递归调用上方的
console.log是在「进入函数时立即执行」,所以按min从4到10的顺序打印(升序); - 递归调用下方的
console.log是在「当前函数的递归调用全部完成后才执行」,也就是调用栈从最顶层开始弹出时依次执行,所以顺序是9、8…4(降序)。
内容的提问来源于stack exchange,提问作者coder87
相关产品推荐
相关产品推荐

