使用 scala 进行重复的所有排列
我正在寻找 scala 方法来给出所有排列而不重复。我知道这个网站上已经有一些帖子,但它们似乎有一个稍微不同的问题。
我正在寻找所有重复的排列。 例如:
combine(List('A','C','G'))
应该产生:
List(List('A'.'A','A'),List('A'.'A','C'),List('A'.'A','G'),List('A'.'C','A'),
List('A'.'C',''C), ... List('G'.'G','G')
如果我的问题已经解决但我找不到它,我很抱歉。
提前致谢。
编辑:
我自己的方法(无法编译):
def combine(size: Int = sym.length) : List[List[T]] = {
size match {
case 0 => List()
case 1 => sym.toList.map(List(_))
case _ => for (el <- sym) yield el :: combine(size-1)
}
}
sym 是一个类的数组成员,其中包含要组合的所有符号。
I am looking for the scala way to give all permutations without repetitions. I know there are some postings on this site already but they seem to have a slightly different problem.
I am searching for all permutations with repetitions.
For example:
combine(List('A','C','G'))
Should yield:
List(List('A'.'A','A'),List('A'.'A','C'),List('A'.'A','G'),List('A'.'C','A'),
List('A'.'C',''C), ... List('G'.'G','G')
I am sorry if my problem is already solved but I was not able to find it.
Thanks in advance.
EDIT:
My own approach (doesn't compile):
def combine(size: Int = sym.length) : List[List[T]] = {
size match {
case 0 => List()
case 1 => sym.toList.map(List(_))
case _ => for (el <- sym) yield el :: combine(size-1)
}
}
sym is an array member of a class which contains all the symbols to be combined.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
与斯卡拉兹:
With Scalaz:
这应该有效:
This should work:
如果您想要结果排列:
您可以省略
toList
但它就在那里,以便您可以看到结果。And if you wanted the resulting permutations:
You can leave out the
toList
but it's there so you can see the results.似乎没有人提出最简单的解决方案,或者至少是最容易阅读的解决方案。它是
(这是以下映射组合的语法糖:
Scala 编译器将上面的
for
表达式转换为它。)It seems no one has suggested the easiest---or, at least, easiest to read---solution. It is
(This is syntactic sugar for the following composition of maps:
to which the Scala compiler translates the above
for
expression.)在 ScalaZ 7 中
In ScalaZ 7
只是从 @opyate 和 @monnef 做出更通用的答案:
这将生成具有大小 permutation_size 重复的排列:
和
Just making a more generic answers, from @opyate and @monnef:
This will generate the permutation with repetition with size permutation_size:
and