使用递归创建树
Posted
技术标签:
【中文标题】使用递归创建树【英文标题】:Creating a tree using recursion 【发布时间】:2016-01-02 17:21:27 【问题描述】:我正在尝试从 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】:您的代码存在很多问题(如果您刚刚开始,这是可以预料的)。
首先,您的类型定义在语法上无效:
# 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
类型的值。 ::
构造函数仅适用于从一个元素和另一个(较小的)列表构建列表。
【讨论】:
感谢您的帮助。我做了你提出的必要更改并上线:h::t -> insert Empty h (fromList List.tl lst)
我现在收到一条错误消息:“错误:此函数的类型为 bstTree -> int -> bstTree 它应用于太多参数;也许你忘记了一个` ;'. insert: bstTree → int → bstTree" 而且我并没有真正看到/理解这个问题。 @杰弗里以上是关于使用递归创建树的主要内容,如果未能解决你的问题,请参考以下文章