【问题标题】:Dead clown with functional data structure具有功能数据结构的死小丑
【发布时间】:2011-12-06 00:58:31
【问题描述】:

我们来解决问题:

我有一个小丑经纪公司,有很多小丑参加不同的派对。有些人参加同一个聚会。我会记录谁参加了哪个聚会。 然后,我有一个死小丑但是我需要解析日志得到要调查的人,小丑和党内其他人,还需要与死小丑相关的所有党和小丑(所有小丑已经在小丑之前参加过的派对)。

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

我的日志是这样的:

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

你认为转换和解析列表会是一个好的数据结构吗?

【问题讨论】:

    标签: f# functional-programming


    【解决方案1】:

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

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

    这会给你一个Map<Party,Clown list>,你可以很容易地查询到哪个小丑在哪个派对上。

    【讨论】:

      【解决方案2】:

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

      我不知道如何在函数式范式中做到这一点,但这里有一个很好的旧命令式风格的想法:

      1. 给你的每个n 小丑和从0(包括)到n(不包括)的号码。这些将用作数组索引
      2. 构建一个n * n 数组,初始化为全零。
      3. 计划聚会时,对于聚会中的每一对小丑(编号为ij),将i,j-th 和j-i-th 单元格设置为1

      当你得到一个死小丑时,你现在要做的就是读取与死小丑编号对应的行。带有 1 的单元格会告诉您哪些小丑与死去的小丑一起参加了派对。

      我认为上面的描述表明,如果图表是针对特定情况设置的,则不必很复杂。再说一次,我不确定图表在函数式编程中表现得有多好,所以如果你的目标是以函数式风格做所有事情,那么图表可能要复杂得多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-14
        • 1970-01-01
        • 2023-03-29
        • 2013-10-20
        相关资源
        最近更新 更多