1

这个问题来自“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)) ...)

我的任务建议通过递归迭代构建结果的简单方法。

我想以更“结构性”的方式来做?方式。我的想法是获取所有可能的 char 子集并多路复用那些增加权重的子集(〜帖子最后一行中的伪代码)。

我通过handy subsetsoperator得到了子集

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

You can express this problem recursively and implement it this exact way. We want to build a function called expend: Set[Char] => List[Set[(Char, Int)]] that returns all the possible combinations of weights for a set of chars (you wrote it chars TO (COMBINATIONS OF weights FOR chars)). The intuitive "by the definition" way is to assign each possible weights to the first char, and for each of these assign each possible weights to the second char and so on...

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

Where allPairsFromChar is trivial from your weightsAll and your FOREACH subset (...) is another flatMap ;)

于 2013-10-31T21:33:39.800 回答