【问题标题】:OCaml - Mirror image of a treeOCaml - 树的镜像
【发布时间】:2014-01-14 11:12:50
【问题描述】:

我的树种是

    type 'a tree = Tree of 'a * 'a tree list;; 

我怎样才能得到这样的树的镜像?对我来说,拥有一个孩子的列表很困惑,因为我不知道如何单独访问每个孩子并在不丢失父母的情况下进行递归,知道吗?

编辑: 我一直在尝试,我认为我得到了解决方案:

    let spec arbol =
         match arbol with
         Tree(a,[])-> Tree(a,[])
         | Tree(a,l)-> Tree(a, List.rev (
                  let rec aux = function
                      Tree(a,[])::[]->Tree(a,[])::[]
                      | Tree(a,[])::l-> [Tree(a,[])]@(aux l)
                      | Tree(a,t)::[]-> [Tree(a, (List.rev (aux t)))]
                      | Tree(a,t)::l-> [Tree(a, (List.rev (aux t)))]@(aux l)
                  in aux l));;

我已经用这棵树试过了:

let p = Tree(1, [
    Tree(2,[]);
    Tree(3, [
        Tree(6,[]);
        Tree(7,[])
        ]);
    Tree(4,[]);
    Tree(5,[])
]);;

我得到了# spec p;;的结果

-: int tree = Tree (1, [
                Tree (5,[]); 
                Tree (4,[]); 
                Tree (3,[
                   Tree(7,[]); 
                   Tree(6,[])]); 
                Tree (2,[])
              ])

所以我猜我的功能按预期工作。如果不正确请告诉我

【问题讨论】:

    标签: recursion tree ocaml


    【解决方案1】:

    如果我理解您要计算的函数,有一个非常简单的答案,只需一行代码。

    不幸的是,您的代码引入了太多难以用肉眼检查的情况。

    在我看来,您的 aux 函数旨在计算树列表的镜像。但是,它不适用于空列表。如果你重写aux 来处理一个空列表,你可能会发现你不需要这么多不同的情况。特别是,您可以删除最外层的匹配项和内部匹配项中的一半。

    事实上,您的aux 函数(如果正确)可以完成所有工作。如果您正确查看它,您可以将aux 用于所有内容。

    由于您使用的是List.rev,我假设您也可以使用List.map。这也值得一看。

    更新

    树本质上是递归结构,因此在寻找树算法时,想象一下如何递归地使用算法通常会有所帮助。在这种情况下,您可以问自己如何将一棵树的所有子树的镜像放在一起,以形成整棵树的镜像。

    【讨论】:

    • 我明白你的意思,其实我已经改写成这样了:let spec tree = let rec aux = function []->[] | Tree(a,t)::l-> [Tree(a, (List.rev (aux t)))]@(aux l) in List.hd (aux [tree]);; 我觉得更清楚了,所有的情况都考虑在内。我正在考虑使用List.map,但我真的不知道如何在我的代码中使用它。
    • 你真的应该使用List.rev_map。那么函数就是单行,let rec spec (Tree (a,ts)) = Tree (a, List.rev_map spec ts)
    • 这就是我所说的解决方案。但让 OP 弄清楚可能会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多