【发布时间】:2011-04-13 10:16:06
【问题描述】:
有人可以教我如何使用 F# 从给定数据制作树吗?例如:数字列表或城市名称列表等。我不知道如何在 F# 中制作树,在这里需要帮助:)
例如: 输入来自运行时,假设它来自文本文件:城市列表名称
输出结果:图形
【问题讨论】:
-
图是比树更通用的数据结构,所以问题更复杂。无论如何,如果您没有说明结果图/树中应连接哪些节点(例如城市),则无法回答该问题。
有人可以教我如何使用 F# 从给定数据制作树吗?例如:数字列表或城市名称列表等。我不知道如何在 F# 中制作树,在这里需要帮助:)
例如: 输入来自运行时,假设它来自文本文件:城市列表名称
输出结果:图形
【问题讨论】:
一种可能的解决方案是使用Discriminated Unions 代表您的数据(在您的情况下为城市或数字)。问题是,您还需要知道您想要表达的城市之间的关系。
例如您可以表达您的城市的“字母顺序”或“最近邻城市”或“按公民数量排序”的关系。正如您所说,您的输入只是城市名称列表,我假设您希望树按字母顺序排列您的城市(即表达“字母顺序”关系),在这种情况下,一种解决方案可能是:
let cities = ["Munich"; "Rome"; "Florence"; "Berlin"; "Paris"; "Marseille"]
type Tree<'A> =
| Node of Tree<'A> * 'A * Tree<'A>
| Leaf
let rec insert tree element =
match element, tree with
| x, Leaf -> Node(Leaf, x, Leaf)
| x, Node(l,y,r) when x <= y -> Node((insert l x), y, r)
| x, Node(l,y,r) when x > y -> Node(l, y, (insert r x))
let rec flatten = function
| Leaf -> []
| Node(l,x,r) -> flatten l @ [x] @ flatten r
let sort xs = xs |> List.fold insert Leaf
|> flatten
let cityTree = List.fold insert Leaf cities
let sortedCities = sort cities
【讨论】: