Recursion OCaml-树的镜像

Recursion OCaml-树的镜像,recursion,tree,ocaml,Recursion,Tree,Ocaml,我的树类型是 type 'a tree = Tree of 'a * 'a tree list;; 我怎样才能得到像这样的树的镜像?对我来说,有一个孩子的列表是令人困惑的,因为我不知道如何单独找到每个孩子,并在不丢失父母轨迹的情况下进行递归,知道吗 编辑: 我一直在努力,我想我找到了解决办法: let spec arbol = match arbol with Tree(a,[])-> Tree(a,[]) | Tr

我的树类型是

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

因此,我想我的函数工作正常。如果不正确,请告诉我

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

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

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

事实上,您的
aux
功能(如果正确)完成了所有工作。如果您正确地查看它,您可以对所有内容使用
aux

既然您使用的是
List.rev
,我想您也可以使用
List.map
。这也是值得一看的

更新


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

我理解您的意思,实际上我已经这样重写了:
let spec tree=let rec aux=function[]->[]|tree(a,t)::l->[tree(a,(List.rev在List.hd(AUX))(AUXL);(我认为更清楚,所有的情况也被考虑。我正在看使用<代码>列表。map < /Cord>。但是我不知道如何在我的代码中使用它。你应该真正使用<代码>列表。RevIMAP < /代码>。然后函数是一行,<代码>让REC SPEC(树(A,TS))=树。(a,List.rev_map spec ts)
这就是我所说的解决方案。但OP最好能找到它。