【发布时间】:2014-12-09 04:01:02
【问题描述】:
我正在尝试增加 4 个计数器,具体取决于列表列表中是否包含某个元素。例如,给定:
check_occurences(A,B,C,D,List)
和:
List = [[a,b,c],[a,b,c,d],[b,d],[a]]
我应该得到:
A = 3; B = 3; C = 2; D = 2
到目前为止我的尝试:
check_occurences(A,B,C,D,List) :-
helper(List,a,A),
helper(List,b,B),
helper(List,c,C),
helper(List,d,D).
helper([],_,A).
helper([H|T],Elt,X) :- member(Elt,H), Count = X + 1, helper(T,Elt,Count).
helper([H|T],Elt,X) :- helper(T,Elt,X).
我的代码背后的想法是我为每个计数器调用 helper。如果 Elt 是 X 的成员,我会增加计数器。如果不是,我使用第三个事实继续递归。当列表为空时,我停止。但是,问题在于递增计数器。
编辑:修正了代码中的错误。
【问题讨论】:
-
使用
select而不是member -
不知道你为什么这么建议。我只需要检查一个元素是否是列表的一部分。如果是,我会增加计数器。如果没有,则不要增加。然后我会转到列表中的下一个列表。
-
哦,对不起,我以为你想数双打。 (这样
[a,a,b]会被计算两次)。
标签: list recursion prolog counter