我正在尝试从给定列表中删除重复项并返回新列表。
例如:
?-removeDuplicates([a,a,b,c],L).
应返回L=[a,b,c]
removeDuplicates([],[]).
removeDuplicates([Head|Tail], List) :-
(
member(Head,Tail),
removeDuplicates(Tail, prevList),
append([], prevList, List)
);
(
not(member(Head,Tail)),
removeDuplicates(Tail,prevList),
append(Head, prevList, List)
).
为了做到这一点,我尝试实现或说明。
如果头部尾巴存在,那么我称之为递归,而我的新列表与vervelist相同。另一方面,如果尾部不存在,则我将递归调用并附加头以脱名单并将结果列入列表。
由于某种原因,我总是会被错误作为答案。
您能帮我了解我做错了什么吗?
如果您使用示踪剂,则在递归末尾发生的removeDuplicates([], prevList)
时,您的程序会失败,当列表为空时。我认为您正在解决这个问题。这可以通过几行代码轻松解决:
removeDup([],[]).
removeDup([H|T],[H|T1]):-
+member(H,T),
removeDup(T,T1).
removeDup([H|T],L):-
member(H,T),
removeDup(T,L).
?- removeDup([1,2,3,4,2,3,5,4,0],L).
L = [1, 2, 3, 5, 4, 0]
false
或更短,使用:
removeDup([],[]).
removeDup([H|T],[H1|T1]):-
(
+member(H,T) ->
H = H1,
removeDup(T,T1);
removeDup(T,[H1|T1])
).