首页 > 解决方案 > 使用递归和模式匹配从列表中删除元素

问题描述

在 F# 中使用递归,我应该编写一个递归函数来从列表 l 中删除一个整数 n。该函数接受 int 和 iList 并返回一个 iList(它是整数列表)

这是我到目前为止所拥有的:

let rec remove n l match l with | E -> failwith "Empty List" | L(h,E) -> if (h=n) then 0 else h | L(h,t) -> if (h=n) then remove n t else h + remove n t

在上面的代码中,我对其进行了设置,以便在从列表中排除给定整数 n 后返回列表中元素的总和,而不是列表中的实际元素。

在排除给定整数 n 后,我需要帮助返回列表的剩余元素。

标签: recursionf#pattern-matching

解决方案


您可以使用累加器参数(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

但是我认为了解第一种方法以及如何使用累加器参数很重要,因为它在函数式编程中很常见,您无法修改值。你会发现很多 List 模块函数都是在某个地方使用累加器实现的。


推荐阅读