F# 从f中的列表中删除元素#
假设我有一个排序列表l,可能有重复的值-我想返回一个列表,其中的值n从l中删除,但只返回一次。-例如,对于输入[1,2,3,3,4]和3,返回[1,2,3,3,4]。我该怎么做 最直接的方法是这样的:F# 从f中的列表中删除元素#,f#,tail-recursion,f#-3.0,F#,Tail Recursion,F# 3.0,假设我有一个排序列表l,可能有重复的值-我想返回一个列表,其中的值n从l中删除,但只返回一次。-例如,对于输入[1,2,3,3,4]和3,返回[1,2,3,3,4]。我该怎么做 最直接的方法是这样的: let rec remove n lst = match lst with | h::tl when h = n -> tl | h::tl -> h :: (remove n tl) | [] -> [] 您递归地遍历列表,直到找到n—
let rec remove n lst =
match lst with
| h::tl when h = n -> tl
| h::tl -> h :: (remove n tl)
| [] -> []
您递归地遍历列表,直到找到
n
——如果找到,则删除它并返回尾部。请注意,这不是尾部递归,但很容易实现。在List.distinct可用之前,您可以使用Seq.distinct:
let l = [1;1;2;3;3;3;4]
let dl =
l
|> Seq.ofList
|> Seq.distinct
|> Seq.toList
在F#4.0中,我们将发布List.distinct:
在F#4.0中,集合API已在数组、列表和Seq中完全规范化。现在,每种类型的所有常见操作都有专门的优化实现,甚至还有一些全新的功能。这意味着总共增加了95个API。对于那些感兴趣的人(我知道我是),我使用累加器提出了一个接受答案的尾部优化版本,因为我对F#不熟悉,递归工作也很生疏
let remove n list =
let rec removeTail n list acc =
match list with
| h::tl when h = n -> List.append (List.rev acc) tl
| h::tl -> (removeTail n tl (h::acc))
| [] -> List.rev acc
removeTail n list []
我使用的资源:
系统.集合.通用.分类列表
?或者(假定已排序)不可变F#list?不可变F#list。我编辑这个问题是为了让这个问题更清楚。你问的问题仍然不清楚-当前的措辞表明你想要一个函数,它接受一个列表l
和一个值n
,从列表中删除值n
,并返回l
的所有其他元素(包括n
的潜在副本)作为一个数组。这就是你想要的吗?是的,我提高了问题的清晰度以反映这一点。输出实际上应该是一个列表(我无意中放入了数组,对不起),您可以很容易地使用list.fold,其中累加器是简单的bool。这会让它变成尾巴recursive@MichalMa:您是指累加器为输出列表+布尔标志的折叠?这是可行的,但使用fold时,您必须将列表遍历到底,这是不必要的。通过一个简单的更改,我的意思是引入一个带累加器的内部函数来构建列表。看起来不错,但您也希望在空列表中返回反向的acc
。@scrwtp谢谢,感谢您提供了最初的答案。这不是OP想要的答案。