反转没有重复项的列表(将其转换为集合)->序言
我需要从列表中删除所有重复项,然后以相反的顺序显示它。
到目前为止我有这个:
reverseInSet([], Y,R):-
R=Y.
reverseInSet([H|T], Y, R):-
removeElement(H,T,T1),
reverseInSet(T1, [H|Y], R).
removeElement(_,[],[]).
removeElement(X,[X|T],L):-
removeElement(X,T,L).
removeElement(X,[Y|T],L):-
removeElement(X,T,L1),
L=[Y|L1].
输出是这样的:
reverseInSet([1,2,3,3,9,3],[],P).
P = [9, 3, 2, 1]
P = [3, 9, 3, 2, 1]
P = [9, 3, 3, 2, 1]
P = [9, 3, 3, 2, 1]
P = [3, 9, 3, 3, 2, 1]
有什么想法吗?
I need to delete all duplicates from a list and then show it in reverse order.
So far I have this:
reverseInSet([], Y,R):-
R=Y.
reverseInSet([H|T], Y, R):-
removeElement(H,T,T1),
reverseInSet(T1, [H|Y], R).
removeElement(_,[],[]).
removeElement(X,[X|T],L):-
removeElement(X,T,L).
removeElement(X,[Y|T],L):-
removeElement(X,T,L1),
L=[Y|L1].
And the output is this:
reverseInSet([1,2,3,3,9,3],[],P).
P = [9, 3, 2, 1]
P = [3, 9, 3, 2, 1]
P = [9, 3, 3, 2, 1]
P = [9, 3, 3, 2, 1]
P = [3, 9, 3, 3, 2, 1]
Any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是最简单的方法。如果源列表中存在重复条目,则保留最后一个此类条目,并丢弃其前面的条目。
您也可以一次完成。您只需要使用累加器以相反的顺序构建结果列表:
这也会保留源列表中的最后一个重复项。但是,由于我们在这里使用累加器来构建结果列表,因此很容易重新调整它以保留任何重复项中的第一个:我们只需检查候选项是否已在结果集中(而不是而不是检查它是否稍后出现在源列表中)。
This is about the simplest way to do it. In the case of duplicate entries in the source list, the last such entry is kept and the ones preceding it are discarded.
You could also do it in a single pass, too. You just need to use an accumulator to build the result list in reverse order:
This also keeps the last duplicates in the source list. But, since we're using an accumulator here to build the result list, it's easy enough to rejigger it to keep the first of any duplicate items: we just check to see if a candidate item is already in the result set or not (rather than check to see if it occurs later in the source list).
使用 reif 库,既纯粹又合理确定:
结果swi-prolog:
这种纯粹的方法显示了合理的答案:
Using reif library, to be both pure and reasonably deterministic:
Result in swi-prolog:
This pure method shows sensible answers with: