【问题标题】:Js: Why shift and not push? [duplicate]Js:为什么要转移而不是推动? [复制]
【发布时间】:2020-12-08 16:16:51
【问题描述】:

我想做一个简单的倒计时函数,如果我将 10 作为参数传递,应该返回一个类似 [10,9,8,7,6,5,4,3,2,1] 的数组

我认为每次我的参数“n”在下面的这个递归函数中传递时,我只需要将新值“n”推送到数组中。但是这里好像 push 方法不合适,需要 unshift 方法,如下图。

但是为什么呢?我不明白逻辑。

下图:函数推送 n:

function countdown(n){
  if (n < 1) {
    return []
  } 
  let array = []
  array = countdown(n-1)
  array.push(n)
  return array
}

console.log(countdown(10))

[1、2、3、4、5、6、7、8、9、10]

下面,函数取消 n 移位:

function countdown(n){
  if (n < 1) {
    return []
  } 
  let array = []
  array = countdown(n-1)
  array.unshift(n)
  return array
}

console.log(countdown(10))

[ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ]

【问题讨论】:

  • 使用push(),您的结果是[countdown(9), 10],即[countdown(8), 9, 10],即[countdown(7), 8, 9, 10],即……这对您有帮助吗?
  • 标准递归问题,被问和回答了数百次......
  • 注意你是pushing 之后递归调用发生

标签: javascript push


【解决方案1】:

也许简化递归函数更容易,以表明如果需要更多值,它会返回一个包含实际值的数组和一个展开的剩余数组。

要得到一个降序排列的数组,你需要把最大的值放在左边,其余的放在右边。这意味着push 是错误的,unshift 是正确的。

function countdown(n) {
    if (n < 1) return []
    return [n, ...countdown(n - 1)];
}

console.log(countdown(10));

【讨论】:

    【解决方案2】:

    Array.push() adds elements to the end of the array.

    使用 countdown()Array.push() 实现,递归函数首先计算所有较小的数组元素 (array = countdown(n-1)。然后,在递归调用之后,pushn 添加到数组中。所以对于countdown(2),数组是:

    countdown(1).push(2) 
    

    由于countdown(1)countdown(0).push(1),而countdown(0)[],我们可以将其扩展为

    [].push(1).push(2)
    

    最终看起来像

    []
    [1]
    [1, 2]
    

    所以我们可以看到push 实现将连续更大的值附加到数组的末尾。

    Array.unshift(),另一方面,将元素添加到数组的开头。因此,按照与以前相同的递归“扩展”,unshift 实现将连续更大的值添加到数组的前面。 countdown(2) 变为 countdown(1).unshift(2)[2].push(countdown(1) 基本相同。所以输出会经过这些步骤

    []
    [1]
    [2, 1]
    

    【讨论】:

    • 好的,这就是重点:所以所有递归的东西都会继续进行(因为我在返回之前调用了我的函数 count-down()。所以如果我通过 5 它会存货,不知何故:5,4,3,2,1,然后它将被推入数组,从最后一个结果开始,所以:1,2,3,4,5。如果我使用 unshift 方法,它将是:1然后 2,1 然后 3,2,1 等等...如果我像这样简化 thist 可以吗?或者听起来很奇怪?(非常感谢)
    • “所有递归的东西都会继续进行(因为我在返回之前调用了我的函数 count-down())”是的,完全正确。除了这里没有发生的异步函数调用,函数中的代码从上到下执行。
    • 我还要阅读有关“吊装”的内容。
    【解决方案3】:

    push 视为从左到右的堆栈的推送操作。在这种情况下,它会简单地将一个元素压入堆栈的顶部(这里的顶部是最右边的元素)

    unshift 就像从左到右的队列中的入队函数。这会将一个元素添加到队列的末尾(最左侧),并且队列的开头将被推得更远一点(向右)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 2020-10-17
      • 2019-01-20
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      相关资源
      最近更新 更多