有人可以用外行的术语向我解释这个 foldl 示例吗?
Can someone explain this foldl example to me in laymens terms?
我正试图准确理解这个功能是如何运作的,但我脑子里想不通。请您展示代码的分步过程吗?
我一直坐在这里,试图在我的电脑上使用计算器在脑海中计算出这个例子,并且运行在我的脑海中多次浏览代码,但它并没有增加向上。双关语不是故意的。
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
等等...
我在这里错过了什么?
积累并不意味着增加。这意味着 运行 您传递给 foldl
的函数。此外,24 的值仅在第一次使用;之后,累加意味着它使用上次的 return 值。这是正确的值顺序:
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
我正试图准确理解这个功能是如何运作的,但我脑子里想不通。请您展示代码的分步过程吗?
我一直坐在这里,试图在我的电脑上使用计算器在脑海中计算出这个例子,并且运行在我的脑海中多次浏览代码,但它并没有增加向上。双关语不是故意的。
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
等等...
我在这里错过了什么?
积累并不意味着增加。这意味着 运行 您传递给 foldl
的函数。此外,24 的值仅在第一次使用;之后,累加意味着它使用上次的 return 值。这是正确的值顺序:
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