【问题标题】:Flattening recursive data structure展平递归数据结构
【发布时间】:2016-04-06 08:05:22
【问题描述】:

我有一个评论线程列表形式的递归数据结构。每个评论可以包含零个或多个回复 (cmets),每个回复可以包含零个或多个回复。我正在尝试编写一个函数来展平此评论线程列表,即给定评论线程列表,所有 cmets 都应作为“顶级” cmets 返回而没有任何回复。我为此编写了一个函数,但它不起作用,它将返回一个空列表。

type Comment =
  { Text    : string
    Score   : int
    Replies : Comment list }

let flattenReplies ({ Comments = cs }) = 
  let rec flatten st =
    match st with
    | [] ->
      st
    | hd::tl ->
      { hd with Replies = [] }
      :: tl
      |> List.collect (fun c -> flatten c.Replies)
  cs
  |> Seq.toList
  |> flatten

【问题讨论】:

    标签: recursion f#


    【解决方案1】:

    你基本上需要实现DFS/BFS算法。 此外,执行此类操作可能表明您的初始数据结构不符合您的需求。

    由于你的问题听起来像是一个家庭作业问题,所以我做了一个简单的 DFS 实现,你肯定可以弄清楚其余的:

    type Comment =
      { Text    : string
        Replies : Comment list }
    
    let replies = function {Text = _; Replies = rs} -> rs
    
    let flattenReplies (cs : Comment list) = 
      let rec flatten q res = 
        match q with
        | [] -> res
        | h::t -> flatten <| (replies h) @ t <| {h with Replies = []}::res
      flatten cs []
    

    【讨论】:

      猜你喜欢
      • 2014-11-24
      • 2019-12-25
      • 2013-11-17
      • 1970-01-01
      • 2018-08-27
      • 2011-01-02
      • 2015-07-14
      • 2017-08-06
      • 1970-01-01
      相关资源
      最近更新 更多