F#遍历相互递归的树来计算元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了F#遍历相互递归的树来计算元素相关的知识,希望对你有一定的参考价值。

给出以下类型:

type Title    = string
type Document = Title * Element list
and Element   = Par of string | Sec of Document

我正在尝试创建一个函数,它将遍历树并计算Sec的出现次数。

给出以下示例:

let s1  = ("section 1", [Par "Bla"])
let s2  = ("section 2", [Sec s21; Par "Bla"])
let s21 = ("subsection 2.1", [Par "Bla"])
let s3  = ("section 3", [Par "Bla"])
let doc = ("Compiler project", [Par "Bla"; Sec s1; Sec s2; Sec s3]);

一个函数采取Document来计算Sections的数量,noOfSecs d在这种情况下将返回4,因为在这种情况下有4 Sections。我尝试了一些东西,但是我有点陷入困境,特别是当我击中Par时要做什么:

let rec noOfSecs d =
    match d with
    | (_,[])    -> 0
    | (_,e::es) -> (findSecs e)
and findSecs = function
    | Sec(t,_::es) -> 1 + noOfSecs (t,es)
    | Par p        -> //What should we do here?
答案

Sec中有0个Par strings,所以你可以在这种情况下返回0。在noOfSecs中,您需要对元素列表中每个元素的Sec案例求和,而不仅仅是第一个。您可以使用List.sumBy

let rec noOfSecs (_, elems) =
    List.sumBy findSecs elems
and findSecs = function
    | Sec d -> 1 + noOfSecs d
    | Par p        -> 0

以上是关于F#遍历相互递归的树来计算元素的主要内容,如果未能解决你的问题,请参考以下文章

leetcode404-----简单的树的遍历

二叉树来了!丨bupt二叉树正式投入运营

无递归、无堆栈且不改变树的树遍历

逻辑数据库设计 - 单纯的树(递归关系数据)(转)

[每日算法0519] 二叉树逐层遍历和通过中序前序获取完整的树

[每日算法0519] 二叉树逐层遍历和通过中序前序获取完整的树