假设我有一个排序列表l,可能有重复值 - 我想返回一个列表,其值为l,但只返回一次。 - 例如,对于输入[1,2,3,3,3,4]和3,返回[1,2,3,3,4]。我该怎么做?
答案 0 :(得分:6)
最直接的方法是这样的:
let rec remove n lst =
match lst with
| h::tl when h = n -> tl
| h::tl -> h :: (remove n tl)
| [] -> []
您递归遍历列表,直到找到n
- 如果您这样做,则将其删除并返回尾部。请注意,这不是尾递归,但可以轻松实现。
答案 1 :(得分:1)
对于那些感兴趣的人(我知道我是),我想出了一个使用累加器的尾部优化版本的接受答案,因为我是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 []
我用过的资源:
答案 2 :(得分:-1)
在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中,我们将按照宣布here:
的方式获得List.distinct在F#4.0中,集合API已在Array,List和Seq中完全规范化。现在,每种类型的所有常见操作都有专门的优化实现,甚至还有一些全新的功能。这表示总共增加了95个API。