2011-11-14 2 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

@Michael은 'fill'을 사용하여 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'은 예상 된'8'과 반대로 6 개의 시퀀스만을 생성합니다. – dsg

관련 문제