我是F#的新手,想知道如何将简单的整数列表转换为树。
let lst =[1;2;3;4]
type Tree=
|Leaf of int
|Node Tree * Tree
列表应该像这样转换为树--->叶1,节点(叶2),节点(节点(叶3,叶4))
答案 0 :(得分:2)
您希望在答案中得到的输出格式有点差,但我的解释是您正在尝试构建平衡的二叉树。要以递归方式执行此操作,您需要将输入列表分成两半,然后从左半部分和右半部分递归构建树。
这有点棘手,因为将功能列表分成两半并不是那么简单。在实践中,您可能可以将数据转换为数组并使用它,但如果您需要功能性解决方案,则可以使用:
type Tree = Leaf of int | Node of Tree * Tree
let rec half marker acc xs =
match xs, marker with
| x::xs, _::_::marker -> half marker (x::acc) xs
| x::xs, _::[] -> List.rev (x::acc), xs
| xs, _ -> List.rev acc, xs
half
函数中的技巧是它遍历列表并保留列表的两个副本。从一个(称为marker
)开始,每个步骤需要两个元素,所以当这个列表为空时,你已到达原始列表的中间位置,我们每步只需要一个元素。
现在你可以编写一个简单的递归函数来构建一个树
let rec makeTree = function
| [] -> failwith "Does not work on empty lists"
| [x] -> Leaf x
| xs -> let l, r = half xs [] xs
Node(makeTree l, makeTree r)