tree - OCaml 中多路树的最大值

标签 tree max ocaml multiway-tree

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

最近,为了考试而学习,我发现了这个练习。

鉴于:
type 'a tree = Tree of 'a * '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

在这里我肯定迷路了,因为我不明白为什么它期望返回一棵树

最佳答案

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

需要指出的另一个问题是问题陈述要求树中的“值”,但您的代码返回的是整个树节点。

关于tree - OCaml 中多路树的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17370809/

相关文章:

tree - 制作graphviz树让 parent 以 child 为中心

javascript - 在树遍历完成回调后执行函数

java - 遍历继承列表

c++ - 检查树是否只有奇数的函数C++

mysql - 选择多列但仅按 1 列分组

java - 从单向选择转换为多向选择

java - ArrayList 可以包含比 int 的最大值更多的元素吗?

ocaml - 使用 ocaml 添加以 10.000 为底的数字

signals - 在信号 ocaml 上转储线程堆栈

c++ - .cma、.cmo、.cmx 文件之间的区别以及如何在编译中正确使用它们?