2011-11-14 12 views

回答

3

another answer获得灵感:

val letters = Seq(1, 2, 3) 

Iterable.fill(n)(letters).foldLeft(List(List[Int]())) { (a, b) => 
    for (a<-a;b<-b) yield(b::a) 
} 

需要进行额外的类型注解是有点麻烦,但它不会没有它的工作(:

val letters = Seq("a", "b", "c") 
val n = 3 

Iterable.fill(n)(letters) reduceLeft { (a, b) => 
    for(a<-a;b<-b) yield a+b 
} 

Seq[java.lang.String] = List(aaa, aab, aac, aba, abb, abc, aca, acb, acc, baa, bab, bac, bba, bbb, bbc, bca, bcb, bcc, caa, cab, cac, cba, cbb, cbc, cca, ccb, ccc) 

要使用字符串以外的东西的工作除非有人知道另一种方式)。

+1

我们可以摆脱大小为'n'的辅助列表吗? – Michael

+0

@迈克尔是使用'填充'作为4e6暗示。我会编辑我的答案来反映这一点。 – Owen

+0

太棒了!感谢您的新版本。 – Michael

2

另一种解决方案:

val alph = List("a", "b", "c") 
val n = 3 

alph.flatMap(List.fill(alph.size)(_)) 
    .combinations(n) 
    .flatMap(_.permutations).toList 

更新:如果你想在输出字符串列表,然后alph应该是一个字符串。

val alph = "abcd" 
+0

当'n'大于'alph'的大小时,这似乎不起作用。例如:'alph = List(0,1)','n = 3'只产生6个序列,而不是预期的'8'。 – dsg

相关问题