我正在尝试在OCaml中实现rec函数,但是我不知道如何过滤结果列表中重复的公共元素,这是我的实现:
let rec common twolists =
match twolists with
| (x, y) ->
match x with
| [] -> []
| s :: ss ->
if memberof (s, y) then
s :: common (ss, y)
else
common (ss, y)
;;
我在2个列表中找到了所有常见的元素,但是我不知道该如何做而不重复。
答案 0 :(得分:1)
一个想法是替换此表达式:
s :: common (ss, y)
有些复杂。
如果s
已经是common (ss, y)
的成员,则您不想再次添加它。因此,可以根据是否存在s
来用两种情况替换此表达式。
为此,您可能需要使用let
:
let rest = common (ss, y) in
. . .
(请注意,如果这是生产代码,列表可能会很长,那么您可能要避免重复调用memberof
。您可能最终会使用树。例如,集合。结果是一个完全简单的集合交集。)