【问题标题】: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。我已经为此工作了一段时间,因此感谢您的帮助,谢谢。

【问题讨论】:

    标签: list recursion tree functional-programming ocaml


    【解决方案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" 而且我并没有真正看到/理解这个问题。 @杰弗里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2011-05-08
    • 2015-03-18
    相关资源
    最近更新 更多