我一直在研究这个问题,要求在两个给定的输入中查找值。例如,输入:(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));

09-16 11:37