如何在列表序言中获得一半的元素数量

问题描述 投票:0回答:1

我有这个谓词,它给出了列表中元素的数量。

get_elements([],0).
get_elements([_|Tail], N) :- get_elements(Tail, N1), N is N1 + 1.


?- get_elements([1,1,1,1,1,1],N).
N = 6.

但相反,我想要3.我怎么能改变我的谓词才能做到这一点?

谢谢!

list prolog
1个回答
1
投票

如果列表中包含奇数个元素,您还没有说出要发生的事情。但我会假设你想要一个结果。

蛮力但简单的方法是使用length/2

count_half(List, HalfCount) :- length(List, N), HalfCount is N div 2.

对于具有奇数个元素的列表,它将给出元素数量的一半减去1(例如,7个元素将产生3的结果)。

一个简单的递归方法(对列表处理更有启发性)是稍微改变一下你的实现:

count_half([], 0).
count_half([_,_|Tail], N) :-
    count_half(Tail, N1),
    N is N1 + 1.

这将计算每对元素。唯一的缺点是,如果存在奇数个元素,则会导致失败。这可以通过一个额外的基本案例来弥补:

count_half([], 0).
count_half([_], 0).
count_half([_,_|Tail], N) :-
    count_half(Tail, N1),
    N is N1 + 1.
© www.soinside.com 2019 - 2024. All rights reserved.