如何获得这棵树的叶子列表? OCaml中的问题

时间:2019-04-15 18:00:21

标签: tree ocaml

我们将得到一棵类型为

的树
type ('nonterminal, 'terminal) parse_tree =
  | Node of 'nonterminal * ('nonterminal, 'terminal) parse_tree list
  | Leaf of 'terminal

及其形式:

let t = (Node ("+", [Leaf 3; Node ("*", [Leaf 4; Leaf 5])])

然后我们被要求编写一个函数,该函数将一棵树作为参数并返回找到的叶子列表(从左到右的形式),从而留下t = [3; 4; 5]

现在这就是我所拥有的,但是它给了我一个错误,我不确定应该如何解决这个问题:

let rec getleaf tree = 
  match tree with
  |Leaf a -> [a]
  | Node (a, Leaf (h)::t) -> h::getleaf t;;

谢谢。

1 个答案:

答案 0 :(得分:0)

列表模式h :: th绑定到列表的开头(单个元素),将t绑定到列表的末尾(本身就是列表)。因此,代码中的名称t将与解析树列表匹配。但是getleaf希望有一个解析树作为其参数。

更新

通常要做的是让getleaf接受一棵树。在Node的代码中,您将必须具有任意数量的递归调用,然后将它们组合在一起以产生该节点的结果。

处理多个递归调用的最惯用的方法是折叠(IMHO)。您还可以使用List.map(这将给出列表列表),然后使用List.concat返回单个列表。 (IMHO)较容易考虑,但它进行了一些不必要的计算。

您可能要考虑是否需要保持叶子的顺序。