list - 如何获得列表序言中元素数量的一半
问题描述
我有这个谓词,它给了我列表中元素的数量。
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。我怎样才能改变我的谓词来做到这一点?
谢谢!
解决方案
如果列表有奇数个元素,你还没有说你想要发生什么。但我会假设你在这种情况下想要一个结果。
蛮力但简单的方法是使用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.
推荐阅读
- postgresql - 如何在 postgres 中缩短或优化 JOIN 查询
- wordpress - 联系表格 7 更改表格标签输出
- reactjs - 类型“{}”不可分配给类型“postList”
- javascript - 添加事件监听器
- javascript - 为什么我在 chrome 控制台中看不到我的对象反应?
- python - python matplotlib:如何控制y轴的位置
- architecture - 去中心化应用架构
- javascript - 如何在数组中获得 Firestore 收集响应?
- c# - 我们可以将 Microsoft TensorFlow 用作常规 TensorFlow 吗?
- node.js - 第一次设置护照。isAuthenticated() 总是返回 false