我正在尝试计算列表中的元素 列表。
我以这种方式实现了代码:
len1([],0).
len1([_X|Xs],N) :- len1(Xs,N1), N is N1+1.
clist([[],[]],0).
clist([Xs,Ys],N):- len1(Xs,N1),len1(Ys,N2),N is N1+N2.
我重新使用列表中的count元素(len1谓词),并且看起来很有效。
任何人都可以说我做得好,很差或可以做,但是最好是其他人(没有len1)。
我不认为这是一个好的实现,而其他似乎也不是通用的。
广告示例仅适用于列表,列表内部包含两个列表。如果我想使通用?我认为需要使用_Xs,但是我尝试更改我的代码并且无法正常工作。 特别是我尝试更改此内容:
clist([Xs,Ys],N):- len1(Xs,N1),len1(Ys,N2),N is N1+N2.
在
clist([_Xs],N):- len1(_Xs,N1),N is N1.
显然不起作用。
答案 0 :(得分:1)
您可以对clist/2
谓词应用 same 技巧:您可以考虑以下两种情况,而不是解决包含两个元素的列表的问题:
[]
,在这种情况下,总数当然为零;和[H|T]
,其中H
是列表,而T
是其余列表的列表。在这种情况下,我们首先计算H
的长度,然后计算(通过递归)T
中列表的总和,然后将它们加在一起。因此我们可以将其实现为:
clist([], 0).
clist([H|T], N) :-
length(H, HN),
clist(T, TN),
N is HN + TN.
可以通过使用累加器来改善上述情况:我们可以定义一个谓词clist/3
,该谓词具有一个变量,该变量可以存储列表 this 中的元素总数,以防万一到达列表的末尾,我们用该变量统一答案,例如:
clist(L, N) :-
clist(L, 0, N).
clist([], N, N).
clist([H|T], N1, N) :-
length(H, HN),
N2 is N1 + HN,
clist(T, N2, N).
答案 1 :(得分:0)
是的,您想概括您的定义是正确的。代替
clist([[],[]],0).
(嗯,首先应该是
clist( [] , 0).
继续...)和
clist([Xs,Ys], N):- len1(Xs,N1), len1(Ys,N2), N is N1+N2.
处理一个列表中的两个列表,将其更改为
clist([Xs|YSs], N):- len1(Xs,N1), len1(YSs,N2), N is N1+N2.
处理列表中任意数量的列表。但是现在第二个len1
被误用了。它接收一个列表列表,而不仅仅是以前的列表。面对必须处理列表(YSs
)才能处理列表([Xs|YSs]
)的问题,我们回到了起点。我们是真的吗?
不完全是。我们已经有了处理列表列表的谓词-我们正在定义clist
!等一下我们定义好了吗?我们还没有完成写下来,是的,但是我们会的。当我们完成记录后,我们将将进行定义。递归是信仰的飞跃:
clist([Xs|YSs], N):- len1(Xs,N1), clist(YSs,N2), N is N1+N2.
此外,列表YSs
的第二个列表比[Xs|YSs]
短 。 那是关键。
如果列表是任意深嵌套的,则递归将是
clist([XSs|YSs], N):- clist(XSs,N1), clist(YSs,N2), N is N1+N2.
具有适当修改的基本案例。
递归是信念的飞跃:假设我们已经有了解决方案,可以使用它来处理手头问题的较小子情况,只需合并结果即可—有了就可以了!我们假定拥有的解决方案之所以存在,是因为我们将其当作已经存在的方式来使用。
recursion( Whole, Solution ) :-
problem( Whole, Shell, NestedCases),
maplist( recursion, NestedCases, SolvedParts),
problem( Solution, Shell, SolvedParts).
一个俄罗斯俄罗斯套娃一直到最下层的问题,都变成了从最深层开始一直回升的解决方案。但是关键是,我们依靠依靠递归来处理内部的套娃,但是许多 it 层次可能嵌套在她的内部。我们只拆开并重新组装 one -最顶部。
答案 2 :(得分:0)
howMany([],_,0).
howMany([Head|Tail],X,Times):-
\+(Head = X),
howMany(Tail,X,Times1),
Times is Times1.
howMany([Head|Tail],X,Times):-
Head = X,
howMany(Tail,X,Times1),
Times is Times1 +1.