Ruby - 具有任意数量元素的所有排列

问题描述 投票:0回答:1

我想变换数组

[3, 4, 8]
[3, 4, 8, 34, 38, 48, 43, 83, 84, 348, 384, 834, 843, 438, 483]

我尝试了

array.permutation
,但这只会返回
[348, 384, 834, 843, 438, 483]
。有没有一种干净的方法可以做到这一点,而无需首先生成每个可能的子集?

ruby permutation
1个回答
0
投票

Array#permutation
采用一个可选参数,告诉它要创建的最大排列大小。

就您而言,您只需要尺寸为

0
,然后是
1
,然后是
2
,... 直到您的
input.count
的所有排列。

因此,就像创建这些数字的范围一样简单,每次使用不同的数字调用

permutation
来映射它们,然后组合结果:

def all_permutations_of(input)
  (1..input.count).flat_map do |permutation_length|
    input.permutation(permutation_length).to_a
  end
end

p all_permutations_of([3, 4, 8])
# => [
#   [3], [4], [8],
#   [3, 4], [3, 8], [4, 3], [4, 8], [8, 3], [8, 4],
#   [3, 4, 8], [3, 8, 4], [4, 3, 8], [4, 8, 3], [8, 3, 4], [8, 4, 3],
# ]
© www.soinside.com 2019 - 2024. All rights reserved.