【问题标题】:Recursive generator in javascriptjavascript中的递归生成器
【发布时间】:2021-09-27 14:24:05
【问题描述】:

我正在尝试创建一个递归生成器,用于生成数组数组的笛卡尔积的元素 例如。 [[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() 表明它具有正确的迭代次数,只是返回了错误的东西。我认为这更多是数组处理的问题......

【问题讨论】:

    标签: javascript recursion yield


    【解决方案1】:

    这应该可以解决问题:更改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);
    }

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 2013-11-19
      • 2012-05-03
      • 2019-08-25
      • 2021-05-22
      相关资源
      最近更新 更多