有人可以用外行的方式向我解释这个折叠示例吗?

时间:2019-06-19 20:35:21

标签: javascript reduce foldleft

我试图确切了解此功能的运作方式,无法在我的大脑中弄清楚。请您显示代码的逐步过程吗?

我一直坐在这里,试图使用计算机上的计算器在脑海中想出这个例子,并在脑海中多次运行该代码,但这并没有加总。双关语无意。

constructor(values) {
  this.values = values || []
}

const list = new List([1,2,3,4])

expect(list.foldl((acc, el) => el / acc, 24)).toEqual(64);

foldl(fn, initialValue) {
  let acc = initialValue;
  for (let i in this.values) {
    acc = fn(acc, this.values[i]);

  }
  return acc; // 64... HOW??!
}

好的,这就是我脑海中的运行方式。请您向我解释为什么我错了,并按照下面的步骤告诉我伪代码中正确的地方。

```
// accumulator is 24 and therefore we divide the first element of the array which is 1 by 24 which equals .041666667

// the accumulator now ACCUMULATES which means 24 plus .041666667 is equal to 24.041666667

// now the accumulator is 24.041666667 and we divide the second element of the array which is 2 by 24 which equals .083333333

// the accumulator which is 24.041666667 now adds .083333333 which equals 24.874999997

// now the accumulator is 24.874999997 and we divide the third element of the array which is 3 by 24.874999997 which equals .120603015 

以此类推...

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

累加并不意味着加法。这意味着要运行传递给foldl的函数。另外,值24仅在第一次使用。之后,累加意味着它使用上次的返回值。这是正确的值顺序:

acc = 24
el = 1
acc = 1/24
el = 2
acc = 2/(1/24) = 48
el = 3
acc = 3/48 = 1/16
el = 4
acc = 4/(1/16) = 64