【问题标题】:creating all permutations of a list with a limited range in Scala [closed]在Scala中创建范围有限的列表的所有排列[关闭]
【发布时间】:2016-11-19 07:18:19
【问题描述】:

我正在尝试创建一个包含给定范围的所有排列的 n 元素列表序列。想要参数化元素的数量和范围。示例:

长度:4,范围:[0, 3]

Seq(List(0, 0, 0, 0), List(0, 0, 0, 1), ..., List(3, 3, 3, 3), ..., List(1, 0, 0, 0))

提前谢谢你。

【问题讨论】:

  • 那么,当您尝试这样做时,遇到了什么问题?
  • 简单地说,我无法操纵排列函数来生成如图所示的列表。
  • 我尝试了 jwvh 的建议,如下: val test = List(1,2,3).toSet[Int].subsets.map(_.toList).toList val test = List. range(0, 2).toList.transpose val test = for { v

标签: list scala permutation seq


【解决方案1】:

这会让你到达那里。

List.fill(4)(0 to 3).flatten.combinations(4).flatMap(_.permutations)

它返回一个Iterator,可以转换为SeqListVector等等。

您需要该范围的 n 个副本,以便combinations() 允许该范围内的每个数字 n 重复。


说明

combinations 完全忽略了元素的顺序,因此 (0,1) 被认为与 (1,0) 相同,并且只会呈现其中一个。您还必须告诉它子组的大小。

permutations 就是对给定元素重新排序,所以 (2,2) 本身只有一个排列,而 (0,0,1) 有 3: (0,0,1) (0,1, 0) (1,0,0)

combinations 创建了元素的初始分组后,每一个都被馈送到permutations 以获得所有可能的重新排序。

【讨论】:

  • 它不会创建所有可能的组合——顺序很重要。例如,不会创建 (3, 0, 1, 0) 之类的东西。想法?
  • @tmesis,哎呀。更新。结果不会按明显的顺序排列,但应该是完整的。
  • 这是一个优雅的解决方案。我尝试将permutations 添加到您的初始回复中,但结果很糟糕。您能否解释一下为什么您的修复有效,但我的尝试产生了过多的输出?
猜你喜欢
  • 2013-11-16
  • 2021-01-31
  • 1970-01-01
  • 2023-03-12
  • 2019-04-24
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 2022-09-28
相关资源
最近更新 更多