首页 > 解决方案 > 如何获得列表序言中元素数量的一半

问题描述

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

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.

但相反,我想要 6 个 3。我怎样才能改变我的谓词来做到这一点?

谢谢!

标签: listprolog

解决方案


如果列表有奇数个元素,你还没有说你想要发生什么。但我会假设你在这种情况下想要一个结果。

蛮力但简单的方法是使用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.

推荐阅读