为何我的rangeOfNumbers递归实现与正确解法结果不同?
递归函数rangeOfNumbers的输出差异原因解析
题目要求:定义一个名为
rangeOfNumbers的函数,接收两个参数,返回一个从startNum开始到endNum结束的整数数组,startNum始终小于等于endNum,必须使用递归实现,不能使用任何循环,且需支持startNum与endNum相等的情况。
你的尝试代码(结果错误)
function rangeOfNumbers(startNum, endNum) { if (startNum > endNum) { return []; } else { const array = rangeOfNumbers(startNum + 1, endNum); array.push(startNum); return array; } } console.log(rangeOfNumbers(1, 5));
正确解法代码(结果正确)
function rangeOfNumbers(startNum, endNum) { if (endNum < startNum) { return []; } else { const numbers = rangeOfNumbers(startNum, endNum - 1); numbers.push(endNum); return numbers; } } console.log(rangeOfNumbers(1, 5));
输出差异的核心原因
两段代码的递归遍历方向和元素插入顺序完全相反,导致最终数组的元素顺序不符:
你的代码逻辑:从起始值向结束值递进递归,再反向插入元素
调用rangeOfNumbers(1,5)时,会先递归到startNum=6(此时6>5,返回空数组),接着从最内层递归开始往数组push元素:先塞5,再塞4,依次到1,最终输出[5,4,3,2,1],和题目要求的升序数组不符,所以结果错误。正确代码逻辑:从结束值向起始值递进递归,正向插入元素
调用rangeOfNumbers(1,5)时,会先递归到endNum=0(此时0<1,返回空数组),接着从最内层开始push元素:先塞1,再塞2,依次到5,最终输出[1,2,3,4,5],完全符合题目要求的顺序。
本质上就是递归时的变量变化方向不同,导致元素插入的顺序反过来了,这就是两段代码输出结果不一致的根本原因。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

