我的树型是
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,[])
])
所以我猜我的功能按预期工作。如果不正确,请告诉我
答案 0 :(得分:1)
如果我理解您尝试计算的功能,那么有一个非常简单的答案需要一行代码。
不幸的是,您的代码引入了很多案例,很难通过眼睛检查。
在我看来,您的aux
函数旨在计算树列表的镜像。但是,它并不适用于空列表。如果您重写aux
以处理空列表,您可能会发现您不会需要这么多不同的案例。特别是,您可以删除最内层匹配和内部匹配中的一半案例。
事实上,您的aux
功能(如果正确)可以完成所有工作。如果你正确看待它,你可以只使用aux
。
由于您正在使用List.rev
,我认为您也可以使用List.map
。这也是值得关注的事情。
<强>更新强>
树本质上是递归结构,因此在寻找树算法时,通常会想象如何递归地使用算法。在这种情况下,您可以问自己如何将树的所有子树的镜像组合在一起,以制作整棵树的镜像。