Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 使用递归和模式匹配从列表中删除元素_Recursion_F#_Pattern Matching - Fatal编程技术网

Recursion 使用递归和模式匹配从列表中删除元素

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之后,我需要返回列表的其余元素的帮助。您可

使用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之后,我需要返回列表的其余元素的帮助。

您可以使用累加器参数(下面代码中的
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
值得注意的是,此函数将有效地颠倒列表的顺序。如果需要保留列表的顺序,可以增强该功能以支持该要求