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 string
s,所以你可以在这种情况下返回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#遍历相互递归的树来计算元素的主要内容,如果未能解决你的问题,请参考以下文章