理解递归函数的析构参数

时间:2016-10-01 05:30:05

标签: javascript recursion ecmascript-6

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

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)的参数。任何相关的输入/参考将不胜感激!

1 个答案:

答案 0 :(得分: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]))