我有一个计算笛卡尔积组合的函数:
function cartes1(a, b, c) {
let arr = []
for (let i1 of a) {
for (let i2 of b) {
for (let i3 of c) {
arr.push([i1, i2, i3])
}
}
}
return arr;
}
我想将它转换为生成器以便在需要时停止,因此进行了以下操作:
function* cartes(a, b, c) {
for (let i1 of a) {
for (let i2 of b) {
for (let i3 of c) {
yield [i1, i2, i3]
}
}
}
}
代码基本相同,但第二个返回错误的结果。
cartes1([1,2,3],[1,2,3],[1,2,3]) // correct
cartes([1,2,3],[1,2,3],[1,2,3])
生成器返回以下内容:
[[ 1, 1, 1 ]
[ 1, 1, 2 ]
[ 1, 1, 3 ]]
生成器函数被调用时,使用yield语句生成值。
cartes(range(1)(3)(1), range(1)(3)(1), range(1)(3)(1))
const range = from => to => function*(step=1) {
for(let i=from;i<=to;i+=step) {
yield i
}
}
我有什么遗漏吗?
谢谢
i1
还没有完成,但是最后一个i3
已经完成了。这会阻止获取i2
的值,因为通过运行最内部的 for 循环,您将不再获得任何值。生成器存储它们的位置,如果完成了...它就停止了。 - Nina Scholz