死小丑与功能数据结构

时间:2011-12-06 00:58:32

标签: f# functional-programming

这里我们解决了这个问题:

我有一个小丑机构,有很多小丑去参加各个派对。有些人去同一个派对。我记录了谁去了哪个派对。 然后,我有一个死小丑,但我需要解析日志,以便让人们去调查,小丑和党内的其他人,但也需要与死小丑相关的所有派对和小丑(所有小丑都在小丑参加的前几派。)

基本上,我已经考虑过用图表来做这件事,但也许这不是最好的主意,图表在这个问题中的使用非常复杂。

我的日志是这样的:

type Action = 
  | Move of Clown * Party
let logs = Action list

您认为转换列表并解析它会是一个很好的数据结构吗?

2 个答案:

答案 0 :(得分:3)

这是一个功能性解决方案,使用Seq.groupBy函数

logs |> Seq.groupBy (function |Move(clown,party) -> party) |> Map.ofSeq

这会给你一个Map<Party,Clown list>,你可以轻松查询,找出哪个小丑在哪一方。

答案 1 :(得分:1)

你是对的,图表非常复杂 - 但这主要是在你开发通用图表的时候。在你的情况下,我会说图表仍然是最好的方式,因为这将直接模拟情况。

我不确定如何在功能范例中做到这一点,但这里有一个很好的旧命令式的想法:

  1. n小丑和号码从0(包括)提供给n(不包括)。这些将作为数组索引
  2. 构建一个n * n数组,初始化为全零。
  3. 当计划派对时,派对中的每对小丑(包含数字ij)设置i,j - 和j-i -th cell to 1
  4. 当你被给予一个死小丑时,你现在要做的就是阅读与死小丑号相对应的行。带有1个的小区将告诉你哪些小丑参加了与死去的小丑的聚会。

    我认为上面的描述表明,如果图表是针对特定情况设置的,则图表不一定非常复杂。然后,我不确定图形在函数式编程中表现得多么好,所以如果你的目标是以函数式方式完成所有事情,那么图形可能会复杂得多。