我有一个像[1,-1,0]的数组,我想用这个数组项和通用大小生成所有组合向量。例如大小:3,然后放入: [1 1 1] [1 1 0] [1 1 -1] ... [0 0 0]或大小:4并输出:[1 1 1 1] [1 1 1 0] ... [0 0 0 0]或其他大小和另一个数组。
如何使用通用数组和通用大小制作它?
答案 0 :(得分:1)
您提到了JavaScript,所以这是使用生成器的一种方式
const append = (xs, x) =>
xs .concat ([ x ])
const ncomb = function* (n, xs = [])
{ const gen = function* (n, acc)
{ if (n === 0)
yield acc
else
for (const x of xs)
yield* gen (n - 1, append (acc, x))
}
yield* gen (n, [])
}
const data =
[ 1, 2, 3 ]
const print = (...xs) =>
console.log (...xs.map (x => JSON.stringify (x)))
print
( Array.from (ncomb (0, data))
// [[]]
, Array.from (ncomb (1, data))
// [[1],[2],[3]]
, Array.from (ncomb (2, data))
// [[1,1],[1,2],[1,3],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3]]
, Array.from (ncomb (3, data))
// [[1,1,1],[1,1,2],[1,1,3],[1,2,1],[1,2,2],[1,2,3],[1,3,1],[1,3,2],[1,3,3],[2,1,1],[2,1,2],[2,1,3],[2,2,1],[2,2,2],[2,2,3],[2,3,1],[2,3,2],[2,3,3],[3,1,1],[3,1,2],[3,1,3],[3,2,1],[3,2,2],[3,2,3],[3,3,1],[3,3,2],[3,3,3]]
)
上面的组合会增加最右边的元素,但是可以更改此顺序。如果将append
操作更改为prepend
,则会生成组合,其中最左边的元素将递增–
const prepend = (xs, x) =>
[ x ] .concat (xs)
print
( Array.from (ncomb (3, data))
// [[1,1,1],[2,1,1],[3,1,1],[1,2,1],[2,2,1],[3,2,1],[1,3,1],[2,3,1],[3,3,1],[1,1,2],[2,1,2],[3,1,2],[1,2,2],[2,2,2],[3,2,2],[1,3,2],[2,3,2],[3,3,2],[1,1,3],[2,1,3],[3,1,3],[1,2,3],[2,2,3],[3,2,3],[1,3,3],[2,3,3],[3,3,3]]
)