展平递归数据结构

时间:2016-04-06 08:05:22

标签: recursion f#

我有一个注释线程列表形式的递归数据结构。每条评论可以包含零个或多个回复(评论),每个回复可以包含零个或多个回复。我试图编写一个函数来展平这个注释线程列表,即给定一个注释线程列表,所有注释都应该返回为" top-level"评论没有任何回复。我已为此编写了一个函数,但它不起作用,它将返回一个空列表。

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

1 个答案:

答案 0 :(得分:0)

您基本上需要实施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 []