我的樹類型的鏡像是OCaml的 - 一棵樹
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,[])
])
所以我想我的功能按預期工作。讓我知道它是否不正確
我明白你的意思,其實我已經重寫了它這樣的: '讓規範樹= \t \t讓REC AUX =功能 \t \t [] - > [] \t \t | Tree(a,t):: l-> [Tree(a,(List.rev(aux t)))] @(aux l) \t in List.hd(aux [tree]);; ' 我覺得更清楚了,所有的情況也是可以考慮的。我正在尋找使用'List.map',但我真的不知道如何在我的代碼中使用它。 – horro
你應該真的使用'List.rev_map'。然後這個函數是單線程的,'let rec spec(Tree(a,ts))= Tree(a,List.rev_map spec)' – nlucaroni
這就是我正在談論的解決方案。但OP可能會更好地弄清楚。 –