使用递归创建树

时间:2015-10-05 22:37:04

标签: list recursion tree functional-programming ocaml

我正在尝试从OCAML中的int列表创建一个树。我是函数式编程的新手。到目前为止,这是我的功能:

let rec theList (lst : int list) = 
 match lst with 
  | [] -> Empty
  | h::t -> insert Empty h::theList List.tl lst

当insert是一个创建节点并将h的值放在节点中的函数时。我尝试遍历列表,但在我使用参数调用insert之后的冒号我得到错误:“错误:变体类型bstTree没有构造函数::”因为这是我定义的类型:

type bstTree = Empty | bstTree * Node of int * bstTree

从广义上讲,我要做的就是通过列表进行递归并在列表中的每个int上调用insert。我已经在这方面工作了一段时间,所以感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

您的代码存在许多问题(如果刚刚开始,可以预料到。)

首先,您的类型定义在语法上无效:

# type bstTree = Empty | bstTree * Node of int * bstTree;;
Error: Syntax error

你很可能想要更像这样的东西:

type bstTree = Empty | Node of bstTree * int * bstTree

其次,您正在定义名为theList的函数,但在函数内部调用名为fromList的函数。我怀疑这些应该是同一个名字。

第三,无需拨打List.tl,因为您已经在名称t下匹配了列表的尾部。

第四,你的表达式中需要更多括号。一个好的起点可能是这样的:

insert Empty h (fromList List.tl lst)

正如编译器指出的那样,您无法将构造函数::应用于类型bstTree的值。 ::构造函数仅适用于从元素和另一个(较小的)列表构建列表。