我正在尝试创建一个函数,给定一个元组列表(我不知道元组是否是正确的术语,我的意思是一个(x,y)列表)和一个 n 叉树,它返回叶子检查元组中的键是否存在于树中,并将子项置于与该键关联的值的位置,如果它不存在,则会引发错误。
我知道我没有很好地解释它,所以我会用一个例子来帮助自己。tuple list = [(1,3);(2,2);(3,1);(10,1)] 如果根的值为 1,那么它将检查第三个孩子(如果不是,它将继续列表),那么如果孩子的值为 10,它将检查他的第一个孩子,直到找到叶子为止。
我想做的是首先使用 List.map 删除与元组的键不匹配的元素以及不在关联值的值位置的子元素,然后递归地对其子元素执行相同的操作。
这是我所做的:
type 'a ntree = Tr of 'a * 'a ntree list;;
let leaf x = Tr(x,[]);;
let alb = Tr(1,[Tr(2,[leaf 3; leaf 4; leaf 2]);Tr(5,[leaf 11; leaf 10]);Tr(3,[leaf 9; leaf 7; leaf 10])]);;
let guida = [(1,3);(2,2);(3,1);(10,1);(16,2);(11,2)];;
let rec cerca_foglia guida (Tr(x,tlist)) =
match tlist with
[] -> x
|_ -> List.map(fun a -> List.mem_assoc x guida && (*a.position = List.nth tlist List.assoc x guida*)) (cerca tlist)
and cerca = function
[] -> raise NotFound
|[t] -> cerca_foglia guida t
|t::rest ->
try cerca_foglia guida t
with NotFound -> cerca rest
当然a.position是不存在的,怎么查呢?
我也尝试了不同的方法:
let rec cerca_foglia guida (Tr(x,tlist)) =
match tlist with
[] -> x
|_ -> List.map(fun a -> a = List.nth tlist List.assoc x guida) (cerca tlist)
and cerca = function
[] -> raise NotFound
|[t] -> if List.mem_assoc t guida then cerca_foglia guida t else raise NotFound
|t::rest ->
try cerca_foglia guida t
with NotFound -> cerca rest
但它仍然给出错误......我该如何解决它?