繁体   English   中英

OCaml中多路树的最大值

[英]Max Value of a Multiway Tree in OCaml

我是一名IT学生,也是OCaml的新手

最近,在考试中我找到了这个练习。

给定:键入'a tree =树'a''树列表

定义一个函数mtree:'a tree - >'a,它返回多路树中所有节点的最大值,遵循OCaml中的通常顺序关系(<=)

我下面会做这样的事情,当然,这是行不通的。

let rec mtree (Tree (r, sub)) =
        let max_node (Tree(a, l1)) (Tree(b, l2)) =
            if a >= b then (Tree(a, l1)) else (Tree(b, l2)) in
        List.fold_left max_node r sub;;

在阅读完答案之后,我发布了固定代码。

let rec mtree (Tree(r,sub)) =
    let max_node (Tree(a, l1)) (Tree(b, l2)) =
        if a >= b then a else b in
    List.fold_left (max_node) r (List.map mtree sub);;

这个想法是相同的,折叠列表比较使用我的本地函数的节点,并通过在连续级别的节点列表上调用函数本身来遍历树。

但是仍然无法正常工作。 现在抱怨fold_left部分中的max_node。

Error: This expression has type 'a tree -> 'a tree -> 'a
       but an expression was expected of type 'a tree -> 'a tree -> 'a tree

在这里,我肯定迷失了,因为我无法理解为什么它希望返回一棵树

这段代码非常可靠(恕我直言)。 缺少的关键是它不会遍历子树的子树。 请注意,您将函数定义为递归(这是非常合理的),但它从不调用自身。

需要指出的另一个问题是问题语句从树中调用“值”,但是您的代码返回整个树节点。

回答我自己的问题有点蹩脚但是在这里收到的提示我可以完成它我将我的代码留在这里面对任何面临类似问题的人。

let maxt (Tree(r,b)) =
    let rec aux (Tree(r,b)) =
        match b with
        [] -> [r]
        |l -> [r]@( List.fold_right (@) (List.map aux b) [])
    in List.fold_left max r (aux (Tree(r,b)));;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM