代码之家  ›  专栏  ›  技术社区  ›  Danor

n元树的深度OCaml

  •  1
  • Danor  · 技术社区  · 6 年前

    我必须只使用函数范式计算OCaml中n元树的深度,而不使用外部自制函数。结构如下:

    type nTree = 
      Id of int
      | Leaf of string
      | Tree of string * string * nTree list
    

    下面是我的结果:

      let rec height t = match t with
         | Id _ -> 0
         | Leaf _ -> 0
         | Tree(_,_,n) -> if n = [] then 1
                          else let e::r = n in max 
                          (List.fold_left (fun acc x -> acc + height x) 1 [e])
                          (List.fold_left (fun acc x -> acc + height x) 1 r)
    

    这很管用,但我觉得很难看 e::r 位由于与 [] 图案 有没有办法让这个警告变得免费和“漂亮”?

    谢谢!

    1 回复  |  直到 4 年前
        1
  •  3
  •   Bergi    6 年前

    这个 e::r 位由于与 [] 图案

    你只需要使用模式匹配而不是 if :

    match n with
      | [] -> 1
      | e::r -> …
    

    但实际上根本没有必要区分这些。你应该这样做

      let rec height = function
         | Id _ -> 0
         | Leaf _ -> 0
         | Tree(_,_,n) -> 1 + List.fold_left max 0 (List.map height n)