【问题标题】:OCaml converting functional arrays as binary tree to listOCaml 将函数数组作为二叉树转换为列表
【发布时间】:2021-12-15 17:43:35
【问题描述】:

我必须将函数数组转换为 OCaml 上的列表,这是我目前所拥有的,但它没有通过测试,谁能帮助我的代码有什么问题以及我应该改用什么方法?

我首先编写了一个函数来返回除第一个值之外的树,然后获取头部并将其与其余部分的头部相结合以创建一个列表。我是不是搞错了?

exception Subscript

let top = function
  | Lf -> raise Subscript
  | Br (v,_,_) -> v

let rec pop = function
  | Lf -> raise Subscript
  | Br (_, Lf, Lf) -> Lf
  | Br (_, lt, rt) -> Br (top lt, rt, pop lt)

let rec listofarray = function
  | Br (v, t1, t2) -> v :: (listofarray (pop (Br(v, t1, t2))))
  | Lf -> []

【问题讨论】:

  • 了解哪些测试失败将非常有价值。
  • 包含树数据类型的定义可能会有所帮助。我可以推断它类似于type 'a tree = Lf | Br of 'a * 'a tree * 'a tree,但在您的问题中包含它不会使代码示例过长。

标签: arrays list tree ocaml


【解决方案1】:

正如 Jeffrey Scofield 所建议的,您可能希望修改 pop 的实现以处理左侧树或右侧 tee 是 Lf 但不是两者的情况。

let rec pop = function
  | Lf -> raise Subscript
  | Br (_, Lf, Lf) -> Lf
  | Br (_, Lf, rt) -> ...
  | Br (_, lt, Lf) -> ...
  | Br (_, lt, rt) -> Br (top lt, rt, pop lt)

现在的问题是pop 在每种情况下应该做什么。考虑第一种情况。

   0
  / \
 /   \
Lf    1
     / \
    /   \
   Lf   Lf

很明显,在pop 之后我们应该有:

   1
  / \
 /   \
Lf   Lf

我们可以通过简单地返回正确的树来得到这个。

let rec pop = function
  | Lf -> raise Subscript
  | Br (_, Lf, Lf) -> Lf
  | Br (_, Lf, rt) -> rt
  | Br (_, lt, Lf) -> ...
  | Br (_, lt, rt) -> Br (top lt, rt, pop lt)

同样,如果我们考虑其他场景,我们可以看到解决方案同样简单。

         0              1
        / \            / \ 
       /   \          /   \
      1    Lf   ->   Lf   Lf
     / \
    /   \
   Lf   Lf

我们可以通过返回左树来实现。

let rec pop = function
  | Lf -> raise Subscript
  | Br (_, Lf, Lf) -> Lf
  | Br (_, Lf, rt) -> rt
  | Br (_, lt, Lf) -> lt
  | Br (_, lt, rt) -> Br (top lt, rt, pop lt)

现在,在不更改 listofarray 的情况下,我们在评估 Jeffrey Scofield 提供的示例时确实得到了正确的结果。

utop # listofarray (Br (0, Lf, Br (1, Lf, Lf)));;
- : int list = [0; 1]
utop # listofarray (Br (0, Br (1, Lf, Lf), Lf));;
- : int list = [0; 1]

【讨论】:

    【解决方案2】:

    你没有说树是否有额外的不变量。除非对可能的树有限制,否则您的 pop 函数不适用于所有树:

    # pop (Br (0, Br (1, Lf, Lf), Lf));;
    - : tree = Br (1, Lf, Lf)
    # pop (Br (0, Lf, Br (1, Lf, Lf)));;
    Exception: Subscript.
    

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 1970-01-01
      • 2013-04-17
      • 2020-09-29
      • 2015-05-07
      • 2015-06-17
      • 1970-01-01
      • 2021-01-13
      • 2015-09-24
      相关资源
      最近更新 更多