我需要一个函数和这样的要求:
我知道它不清楚,但似乎很难解释,所以看看这些例子。这样的一些例子:
given: [1, 1]
return: [[0, 0]]
given: [2, 2]
return: [[0, 0], [0, 1], [1, 0], [1, 1]]
given: [2, 3]
return: [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2]]
given: [3, 3]
return: [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]
given: [1, 1, 1]
return: [[0, 0, 0]]
given: [1, 1, 2]
return: [[0, 0, 0], [0, 0, 1]]
given: [2, 1, 2]
return: [[0, 0, 0], [0, 0, 1], [1, 0, 0], [1, 0, 1]]
given: [2, 2, 2]
return: [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]
......
如何使用lodash或Immutable或任何其他库来编写此功能?感谢。
=========== 更新 ===========
最后,我使用cartesian product of js-combinatorics和lodash解决了问题 首先,我可以轻松地将给定数组转换为某些数组:
import _ from 'lodash';
const givenArr = [2, 1, 2];
const arr = givenArr.map((v) => _.range(v));
console.log(arr); // [[0, 1], [0], [0, 1]]
将变换后的数组传递给js-combinatorics api:
const cp = Combinatorics.cartesianProduct([0, 1], [0], [0, 1]);
console.log(cp.toArray());
// [ [ 0, 0, 0 ], [ 1, 0, 0 ], [ 0, 0, 1 ], [ 1, 0, 1 ] ]
答案 0 :(得分:3)
所以在更新后我实际上理解了这个问题。
至于解决方案。我认为递归方法在这里最好。我只是给出伪代码并将实现留给你:
function getAllCombinations( inputArr ) {
if inputArr has just one element {
return a list with all possible values
}
first = get the first element of the input array
newInput = inputArr with the first element removed
subResult = getAllCombinations( newInput )
result = empty list
for each possible value for the first element of the result as newElement
(can be enumerated by using first) {
combine newElement with subResult and put in result
}
return result
}
因此,背后的想法是,从输入中取出第一个元素,递归地为较小的输入生成所有解。然后将解决方案与第一个元素产生的所有可能元素结合起来。
基本情况是,当输入数组只有一个元素时。这里的答案是该单元格的所有可能值的列表。