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最好能找到它。