1

初心者の質問。List("ab", "def", "t") のような文字列に 1 つ以上の文字を含む任意の長さのリストが与えられた場合、すべての組み合わせを含むリストをどのように生成しますか? 元。List("adt", "aet", "aft", "bdt", ...) よろしくお願いします。

4

4 に答える 4

1
List("ab", "def", "t").foldLeft(List("")){ (acc, s) =>
  for(prefix <- acc; c <- s) yield (prefix + c)
}
于 2013-01-03T04:07:08.753 に答える
1

単純な再帰メソッドは次のようになります。

def foo(xs: List[String], current: String = ""): List[String] = xs match {
  case head :: Nil =>
    head map { c =>
      current + c
    } toList

  case head :: tail =>
    head flatMap { c =>
      foo(tail, current+c)
    } toList

  case _ => Nil
}

このメソッドは末尾再帰ではないことに注意してください。したがって、長いリストではオーバーフローします。

于 2013-01-03T01:48:08.340 に答える
-1

自分で Scala から始めたばかりですが、「サブセット」メソッドを使用してほとんどの作業を行うことができます。

val lst = List("ab", "def", "t")
val re = (for(l <- lst) yield (l.toCharArray)).flatten.toSet.subsets.toList
val res = for(r <- re) yield (r.mkString)

これにより、次のことが得られます。

res: List[String] = List("", e, t, f, a, b, d, et, ef, ea, eb, ed, tf, ta, tb, t
  d, fa, fb, fd, ab, ad, bd, etf, eta, etb, etd, efa, efb, efd, eab, ead, ebd, t
  fa, tfb, tfd, tab, tad, tbd, fab, fad, fbd, abd, etfa, etfb, etfd, etab, etad,
   etbd, efab, efad, efbd, eabd, tfab, tfad, tfbd, tabd, fabd, etfab, etfad, etf
  bd, etabd, efabd, tfabd, etfabd)
于 2013-01-03T14:11:38.153 に答える