javascript 中的递归生成器
Recursive generator in javascript
我正在尝试创建一个递归生成器,用于生成数组数组的笛卡尔积的元素
例如。 [[1,2,3], [a,b,c]] : [1,a] -> [1,b] -> [1,c] -> [2,a] ..
此 python 代码有效:
def gen(l):
if not l:
yield ()
else:
for _ in l[0]:
for __ in gen(l[1:]):
yield (_,) + __
为什么这个 Javascript 代码没有?
function* cartesianProduct(arrayOfArrays){
if (arrayOfArrays.length === 0){
yield []
}else{
for(_ of arrayOfArrays[0]){
for(__ of cartesianProduct(arrayOfArrays.slice(1))){
yield __.concat([_])
}
}
}
}
我不知道 yield* 如何适应这个。我已经尝试了每一种排列,但它仍然无法正常工作。 Array.from() 表明它有正确的迭代次数,只是返回了错误的东西。我认为这更多是数组处理的问题...
这应该可以解决问题:更改 for(const _ of arrayOfArrays[0])
function* cartesianProduct(arrayOfArrays) {
if (arrayOfArrays.length === 0) {
yield [];
} else {
for (const _ of arrayOfArrays[0]) {
for (__ of cartesianProduct(arrayOfArrays.slice(1))) {
//updated to match your expected order
yield [_].concat(__)
}
}
}
}
let data = [
['1', '2', '3'],
['a', 'b', 'c']
];
for (v of cartesianProduct(data)) {
console.log(v);
}
我正在尝试创建一个递归生成器,用于生成数组数组的笛卡尔积的元素 例如。 [[1,2,3], [a,b,c]] : [1,a] -> [1,b] -> [1,c] -> [2,a] ..
此 python 代码有效:
def gen(l):
if not l:
yield ()
else:
for _ in l[0]:
for __ in gen(l[1:]):
yield (_,) + __
为什么这个 Javascript 代码没有?
function* cartesianProduct(arrayOfArrays){
if (arrayOfArrays.length === 0){
yield []
}else{
for(_ of arrayOfArrays[0]){
for(__ of cartesianProduct(arrayOfArrays.slice(1))){
yield __.concat([_])
}
}
}
}
我不知道 yield* 如何适应这个。我已经尝试了每一种排列,但它仍然无法正常工作。 Array.from() 表明它有正确的迭代次数,只是返回了错误的东西。我认为这更多是数组处理的问题...
这应该可以解决问题:更改 for(const _ of arrayOfArrays[0])
function* cartesianProduct(arrayOfArrays) {
if (arrayOfArrays.length === 0) {
yield [];
} else {
for (const _ of arrayOfArrays[0]) {
for (__ of cartesianProduct(arrayOfArrays.slice(1))) {
//updated to match your expected order
yield [_].concat(__)
}
}
}
}
let data = [
['1', '2', '3'],
['a', 'b', 'c']
];
for (v of cartesianProduct(data)) {
console.log(v);
}