【问题标题】:understanding destructured arguments to recursive function理解递归函数的解构参数
【发布时间】:2016-10-01 21:38:43
【问题描述】:

我正在解决一个问题,其中一个数组作为解构参数传递给一个函数,然后该函数用于递归地将数组中每个数字元素的值加倍。 (练习的目的是设计一个不使用数组辅助方法的解决方案)

const numbers = [1, 2, 3] 
// should return '[2, 4, 6]'

这是我找到的解决方案:

function double([first, ...rest]) {
  if (rest.length) {
    return [first * 2, ...double(rest)];
  } else {
    return [first * 2];
  }
}

(FWIW 我还注意到,当您省略 else 条件时,此解决方案将起作用。)

我很难理解第二个块中的操作first * 2 是如何转换为rest 作为...double(rest) 的参数的。任何相关的输入/参考将不胜感激!

【问题讨论】:

  • 你说的是else 块中的return [first * 2]; 吗?和rest没有任何关系。
  • 它是递归的,它接受任意数量的参数。第一个参数始终定义为first,而其余参数使用其余参数,并且将是一个数组。然后它将这些参数传递给下一个递归调用,其中rest 数组中的第一个数字将作为first 传递给下一个调用等,直到没有更多参数
  • 对空数组的情况进行空检查会稍微好一些(在这种情况下,first 将是undefined,你应该返回[])。然后它将使用一个空数组作为输入,但现在情况并非如此。
  • @torazaburo 感谢您指出这一点,我会相应地重构
  • @adeneo 准确地说,它不接受任何数量的参数。它接受一个参数,一个数组,包含任意数量的元素。

标签: javascript recursion ecmascript-6


【解决方案1】:

分解你的代码...

[first, ...rest] = [1,2,3] //returns first = 1; rest = [2,3]

在第二次调用中,不使用价差..

[1 * 2, double(rest)] //rest = [2,3]
[first, ...rest] = [2,3] //returns first = 2, rest = 3
[1*2, [2*2, double(rest)]

在第三次调用中,不使用价差..

[1*2, [2*2, double(rest)]//rest = [3]
[first, ...rest] = [2,3] //returns first = 2, rest = [3]
[1*2, [2*2, [3*2]]

这给了[2,[4,[6]]]

通过使用...double() 而不是double(),数组将被展平并返回为[2,4,6]

下面是没有spread(...)的例子

function double([first, ...rest]) {
  if (rest.length) {
    return [first * 2, double(rest)];
  } else {
    return [first * 2];
  }
}

console.log(double([1,2,3]))

【讨论】:

  • 可爱!我现在看到我是如何忽略使用这种解构语法的扁平化方面
猜你喜欢
  • 2013-01-16
  • 2018-05-31
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 2021-02-12
  • 1970-01-01
  • 2021-12-14
相关资源
最近更新 更多