Recursion 使用递归和模式匹配从列表中删除元素
使用F#中的递归,我应该编写一个递归函数来从列表l中删除整数n。 函数接受int和iList并返回一个iList(整数列表) 这就是我到目前为止所做的:Recursion 使用递归和模式匹配从列表中删除元素,recursion,f#,pattern-matching,Recursion,F#,Pattern Matching,使用F#中的递归,我应该编写一个递归函数来从列表l中删除整数n。 函数接受int和iList并返回一个iList(整数列表) 这就是我到目前为止所做的: 让rec删除nl 匹配 |E->failwith“空列表” |L(h,E)->如果(h=n),则为0,否则为h |L(h,t)->如果(h=n),则删除n t,否则h+删除n t 在上面的代码中,我将其设置为在从列表中排除给定的整数n后,返回列表中元素的总和,而不是列表中的实际元素 在排除给定的整数n之后,我需要返回列表的其余元素的帮助。您可
让rec删除nl
匹配
|E->failwith“空列表”
|L(h,E)->如果(h=n),则为0,否则为h
|L(h,t)->如果(h=n),则删除n t,否则h+删除n t
在上面的代码中,我将其设置为在从列表中排除给定的整数n后,返回列表中元素的总和,而不是列表中的实际元素
在排除给定的整数n之后,我需要返回列表的其余元素的帮助。您可以使用累加器参数(下面代码中的
acc
)这样做。acc
参数用于携带上一次调用递归函数的结果,从而生成最终结果。这是函数式编程中常见的范例。在本例中,我们以空列表开始acc
,并向其中添加元素,但当它与x
匹配时跳过
let rec remove x l acc =
match l with
| [] -> acc
| h::t when x = h -> List.append acc t
| h::t -> remove x t (List.append acc [h])
像这样使用它:
remove 1 [1;2;3] []
另一种方法是使用List.collect
:
let remove_use_collect x l =
let helper y =
if x = y then [] else [y]
List.collect helper l
然而,我认为理解第1种方法以及如何使用累加器参数是很重要的,因为它在函数式编程中非常常见,您不能修改值。您会发现许多列表模块函数都是在某个地方使用累加器实现的。来自sashang的答案假设了内置的F#
List
类型。由于该问题似乎在案例E
和L
中使用了自定义类型,因此这里的答案根本不依赖于列表
模块或类型。它也不会将累加器作为顶级参数公开,因此调用方无需担心传递初始值:
type ilist = E | L of (int * ilist)
let remove value list =
let rec remove value acc = function
| E -> acc
| L (head, tail) when head = value -> tail |> remove value acc
| L (head, tail) -> tail |> remove value (L (head, acc))
list |> remove value E
值得注意的是,此函数将有效地颠倒列表的顺序。如果需要保留列表的顺序,可以增强该功能以支持该要求