Recursion 扁平化递归数据结构
我有一个注释线程列表形式的递归数据结构。每个评论可以包含零个或多个回复(评论),每个回复可以包含零个或多个回复。我正在尝试编写一个函数来平展这个注释线程列表,即给定一个注释线程列表,所有注释都应该作为“顶级”注释返回,而不需要任何回复。我已经为此编写了一个函数,但它不工作,它将返回一个空列表Recursion 扁平化递归数据结构,recursion,f#,Recursion,F#,我有一个注释线程列表形式的递归数据结构。每个评论可以包含零个或多个回复(评论),每个回复可以包含零个或多个回复。我正在尝试编写一个函数来平展这个注释线程列表,即给定一个注释线程列表,所有注释都应该作为“顶级”注释返回,而不需要任何回复。我已经为此编写了一个函数,但它不工作,它将返回一个空列表 type Comment = { Text : string Score : int Replies : Comment list } let flattenReplies
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
您基本上需要实现/算法。 此外,执行此类操作可能表明初始数据结构不适合您的需要 由于您的问题听起来像是一个家庭作业问题,我做了一个简单的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 []
输入注释=
{文本:字符串
回复:评论列表}
让回复=函数{Text=\\回复=rs}->rs
让我们看看回复(cs:评论列表)=
让rec展平q res=
匹配q
|[]->res
|h::t->plant您基本上需要实现/算法。
此外,执行此类操作可能表明初始数据结构不适合您的需要
由于您的问题听起来像是一个家庭作业问题,我做了一个简单的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 []
输入注释=
{文本:字符串
回复:评论列表}
让回复=函数{Text=\\回复=rs}->rs
让我们看看回复(cs:评论列表)=
让rec展平q res=
匹配q
|[]->res
|h::t->展平