这是一个递归算法。以下是伪代码(未经过测试的OCaml代码):
type result = {n1 : node; n2 : node; d1 : int ; d2 : int; distance: int}
let find_max (n : node) : result =
let max (s1 : result) (s2 : result) = if s1.distance < s2.distance then s2 else s1 in
let cl : node list = Node.children n in
if cl = []
then { n1 = n; n2 = n; d1 = 0; d2 = 0; distance = 0 }
else
let ml = List.map find_max cl in
let nl = List.map (fun e -> e.n1, e.d1+1) ml in
let (k1,d1)::(k2,d2)::nl = nl in
let k1,d1,k2,d2 = if d1 > d2 then k1,d1,k2,d2 else k2,d2,k1,d1 in
let s = {n1 = k1;n2 = k2; d1 = d1; d2 = d2; distance = d1+d2} in
let m1 = List.fold_left (fun r (e,d) ->
if r.d1< d
then { r with n1 = e; d1 = d; distance = d+d2 }
else if r.d2 < d
then { r with n2 = e; d2 = d; distance = d+d1 }
else r) s nl in
max m1 (List.fold_left max (List.hd ml) (List.tl ml))
m1
值是通过保留 nl 列表中深度最深的两个节点,其距离为它们深度之和而构建的。
List.map
是一个函数,将给定函数应用于列表的所有元素,并返回结果列表。
List.fold_left
是一个函数,递归地将给定函数应用于累加器和列表的元素,每次使用前一次应用的结果作为新的累加器值。结果是最后一个累加器值。
List.hd
返回列表的第一个元素。
List.tl
返回不包含第一个元素的列表。