如何获得具有通用大小的数组的所有组合?

时间:2018-11-01 09:22:17

标签: arrays generics recursion combinations

我有一个像[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]或其他大小和另一个数组。

如何使用通用数组和通用大小制作它?

1 个答案:

答案 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]]
  )