【问题标题】:Convert integer list into tree in F#在 F# 中将整数列表转换为树
【发布时间】:2013-10-02 19:41:11
【问题描述】:

我是 F# 新手,想知道如何将简单的整数列表转换为树。

let lst =[1;2;3;4]
type Tree=
 |Leaf of int
 |Node Tree * Tree

list 应该像这样转换为树 ---> Leaf 1,Node(Leaf 2),Node(Node(Leaf 3,Leaf 4))

【问题讨论】:

  • 您想要得到的具体结果是什么?你想得到一棵平衡的树吗?
  • 我同意 Tomas 的观点——很难说你希望输出什么样的树。如果这是家庭作业,那么也许你应该分享你已经尝试过的东西。

标签: list f# tree


【解决方案1】:

您想要在答案中获得的输出格式有点差,但我的解释是您正在尝试构建平衡的二叉树。要递归执行此操作,您需要将输入列表分成两半,然后从左右两半递归构建树。

这有点棘手,因为将函数列表分成两半并不是那么简单。在实践中,您可能可以将数据转换为数组并使用它,但如果您想要一个功能解决方案,您可以使用:

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)

【讨论】:

  • 感谢 Tomas,我尝试了几种使用 for 循环的方法,但没有成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
相关资源
最近更新 更多