OCaml - 树的镜像

时间:2014-01-12 17:51:32

标签: recursion tree ocaml

我的树型是

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

如何获得这样的树的镜像?对于我来说,有一个孩子的名单令人困惑,因为我不知道如何单独给每个孩子,并且不知道输出会失去父母的轨道吗?

EDITED: 我一直在努力,我想我得到了解决方案:

    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,[])
              ])

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

1 个答案:

答案 0 :(得分:1)

如果我理解您尝试计算的功能,那么有一个非常简单的答案需要一行代码。

不幸的是,您的代码引入了很多案例,很难通过眼睛检查。

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

事实上,您的aux功能(如果正确)可以完成所有工作。如果你正确看待它,你可以只使用aux

由于您正在使用List.rev,我认为您也可以使用List.map。这也是值得关注的事情。

<强>更新

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