我一直在研究这个问题,要求在两个给定的输入中查找值。例如,输入:(1,5)产生结果:[1,2,3,4,5]。这个问题应该给出一个递归的解决方案。
这是有效的解决方案:
function rangeOfNumbers(startNum, endNum) {
if (endNum - startNum === 0) {
return [startNum];
} else {
var numbers = rangeOfNumbers(startNum, endNum - 1);
numbers.push(endNum);
console.log(numbers);
return numbers;
}
}
我遇到的麻烦是了解此解决方案的工作方式。我尝试通过console.log进行调试,并且看起来像这样添加了值:
[ 1, 2 ]
[ 1, 2, 3 ]
[ 1, 2, 3, 4 ]
[ 1, 2, 3, 4, 5 ]
如果我的endNum值最初被声明为5并且我将endNum推到数组的末尾,为什么我的数组看起来不是这样的:
[5,4,3,2,1]
令人惊讶的是,当我将递归函数更改为此:
var numbers = rangeOfNumbers(startNum+1, endNum);
numbers.push(startNum);
该数组如下所示:
[ 5, 4, 3, 2, 1 ]
任何反馈或澄清对此将不胜感激,谢谢!
最佳答案
基本上它是做什么的:
1)检查数字(endNum
)是否等于startNum
。 (这是断路器状态)
2)如果它们不相等,它将调用函数rangeOfNumbers
,其中endNum
减1。
现在以rangeOfNumbers(1,3)
为例,它较小。
让我们调用每个返回number#X
,现在我们分配的是
1)rangeOfNumbers(1,3).
start
不等于end
(1!== 3),因此我们再次调用rangeOfNumbers
并将其分配给变量numbers
(number#1),并且结尾减少一。
2)rangeOfNumbers(1,2).
start
不等于end
(1!== 3),因此我们再次调用rangeOfNumbers
并将其分配给变量numbers
(number#2),并且结尾减少一。
3)
rangeOfNumbers(1,1)。
start等于end(1 === 1),因此我们返回[1]
(startNum)
4)
基本上,我们将此值分配给number#2
,然后按endNum
(从第2步开始;)),所以我们这样做:
// equal to do [1].push(2) because endNum in step2 was 2.
numbers.push(endNum);
return numbers;
5)
在此步骤中,我们将步骤4的返回值[1,2]分配给
number#1
,并与步骤4相同。// equal to do [1, 2].push(3) because endNum in step1 was 3.
numbers.push(endNum);
return numbers;
6)
我们返回最后一个返回值,因此函数结束。
[1, 2, 3]
以其他形式看到它,可能类似于
rangeOfNumbers(1,1) --> this returns [1]
rangeOfNumbers(1,2) --> this returns [1, 2]
rangeOfNumbers(1,3) --> this returns [1, 2, 3]
console.log(result)
从底部到顶部读取,就像
LIFO
阅读this article,并用图片详细解释所有内容
回答有关以下原因的问题:
var numbers = rangeOfNumbers(startNum+1, endNum);
使数组成为
[5, 4, 3, 2, 1]
是因为将start
从1增加到5,然后开始压入。如果您阅读了我以前的回答,那么很容易找到原因。function rangeOfNumbers(startNum, endNum) {
if (endNum - startNum === 0) {
return [startNum];
} else {
let numbers = rangeOfNumbers(startNum, endNum - 1);
numbers.push(endNum)
return numbers;
}
}
console.log(rangeOfNumbers(1, 5));