1

この問題は "Functional Programming Principles in Scala" @ Coursera からのものであるため、この質問に完全なコードを含めることは避ける必要があります.締め切りは過ぎていますが、今後も常に何年もかかります. この変換を実装する方法に関する一般的な提案を探していました。

可変長のタプルのセット、小文字の文字列の完全なサブセットがあります

val indexes = Set('a', 'b', 'c')

および各文字の最大許容出現回数を持つタプルのセット

val occurences = Set(('a', 1), ('b', 5), ('c', 2))

加重タプルの組み合わせを取得したい:

val result = Seq(Set(), Set((a, 1)), Set((b, 1)), Set((b, 2)) ... Set((a, 1)(b, 2)(c, 2)) ...)

私の割り当ては、再帰的反復を介して結果を構築する簡単な方法を提案しています。

もっと「構造的に?」でやりたい。仕方。私の考えは、可能なすべての文字サブセットを取得し、重みを追加してそれらを多重化することでした(〜投稿の最後の行の疑似コード)。

subsetsハンドリー演算子を介してサブセットを取得しました

val subsets = Seq(Set(), Set(a), Set(b), Set(c), Set(a, b), Set(a, c), Set(b, c), Set(a, b, c)

また、各文字の特定の Int 値のマップ、次のいずれか

val weightsMax Map(a -> 1, b -> 5, c -> 2)

val weightsAll Map(a -> List(1), b -> List(5,4,3,2,1), c -> List(2,1))

この操作にどの言語機能を使用すればよいかよくわかりません。コレクション操作については知ってforいますが、機能パラダイム(およびコレクション操作も)が初めてなので、このレベルの操作を操作した経験はありません。これを解決するために、企業スタイルのJava / XMLを作成しても問題はありません(ええ...)。

似たようなものを定義したいと思います:

FOREACH subset (MAP chars TO (COMBINATIONS OF weights FOR chars))

4

1 に答える 1

1

この問題を再帰的に表現し、まさにこの方法で実装できます。expend: と呼ばれる関数を構築したいと考えています。Set[Char] => List[Set[(Char, Int)]]これは、文字セットの重みのすべての可能な組み合わせを返します (あなたが書きましたchars TO (COMBINATIONS OF weights FOR chars))。直感的な「定義による」方法は、可能な各重みを最初の文字に割り当て、これらのそれぞれについて、可能な各重みを2番目の文字に割り当てることです...

def expend(set: Set[Char]): List[Set[(Char, Int)]] =
  if(set isEmpty) Nil else
  allPairsFromChar(set head) flatMap (x => expend(set tail) map (_ + x))

allPairsFromChar はあなたの weightsAll から自明であり、あなたFOREACH subset (...)は別のものflatMapです;)

于 2013-10-31T21:33:39.800 に答える