[英]OCaml - Mirror image of a tree
我的樹類型是
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;;
結果# 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
。 這也是要看的東西。
更新
樹本質上是遞歸結構,因此在查找樹算法時,通常有助於想象您將如何遞歸使用算法。 在這種情況下,您可能會問自己如何將一棵樹的所有子樹的鏡像放在一起以構成整個樹的鏡像。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.