元素少于或等于给定数组中元素的数组

时间:2018-07-01 13:44:40

标签: javascript arrays

解决以下问题的最JS方式是什么?

给定一个数组A,找到所有数组B,使得对于i <= A.length:B [i] <= A [i]。我期望的示例:

#Input
A = [1,2,0]
#Output
B = [[0,0,0],
     [1,0,0],
     [1,1,0],
     [1,2,0],
     [0,1,0],
     [0,2,0]]

在Python中,我使用了:

B = [[]]; 
for t in [range(e+1) for e in A]:
    B = [x+[y] for x in B for y in t]

谢谢!

2 个答案:

答案 0 :(得分:0)

使用以下代码(对数组a的一项进行任何循环):

var a = [1, 2, 0], b = [];

for (var i = 0; i < a[0]; i++) {
  for (var j = 0; j < a[1]; j++) {
    for (var k = 0; k <= a[2]; k++) {
      b.push([i, j, k]);
    }
  }
}

如果仅在运行时知道数组a中的项目数,请使用以下递归函数:

function fillArray(source, dest, recursionLevel, tempArr) {
  if (recursionLevel >= source.length) {
    dest.push(tempArr);
    return;
  }

  for (var i = 0; i <= source[recursionLevel]; i++) {
    var tempArr2 = tempArr.slice(); // Copy tempArr
    tempArr2.push(i);
    fillArray(source, dest, recursionLevel + 1, tempArr2);
  }
}

fillArray(a, b, 0, []);

答案 1 :(得分:0)

我找到了这个解决方案。我相信它可以用更好的方式编码。但是,它可以工作,希望您发现它有用

all_combinations(A){
    var B = [];

    for (var i = 0; i < A[0] + 1; i++) {
        B.push([i]);
    }

    for (var i = 1; i < A.length; i++) {
        var _tmp_array = [];
        for (var j = 0; j < A[i] + 1; j++) {
            for (var k = 0; k < B.length; k++) {
                var _new_element = B[k].concat([j]);
                _tmp_array.push(_new_element);
            }
        }
        B = _tmp_array;
    }

    return B;
}