Prolog实现嵌套列表元素计数并输出计数列表的技术求助
嵌套列表子列表元素数量统计实现方案
你已经写好的count_list/2可以直接用来统计单个列表的元素数,只需要在外层新增一个递归谓词,遍历嵌套列表的每个子列表,逐个调用count_list/2并收集结果即可。
完整代码实现
% 你已实现的单列表元素计数谓词 count_list([], 0). count_list([_|T], C) :- count_list(T, CNT), C is CNT + 1. % 嵌套列表的子列表长度统计谓词 clistoflists([], []). clistoflists([Sublist|Rest], [Count|CountsRest]) :- count_list(Sublist, Count), clistoflists(Rest, CountsRest).
代码逻辑说明
clistoflists([], []):基础终止条件,当输入的嵌套列表为空时,输出的长度结果列表也为空。clistoflists([Sublist|Rest], [Count|CountsRest]):递归处理逻辑:- 取出嵌套列表的第一个子列表
Sublist,调用count_list/2统计其元素数量,结果存入Count。 - 递归处理嵌套列表的剩余部分
Rest,得到剩余子列表的长度列表CountsRest。 - 将当前子列表的长度
Count与剩余结果CountsRest拼接,组成最终的输出列表。
- 取出嵌套列表的第一个子列表
测试验证
调用你给出的示例查询:
?- clistoflists([[a,b,c,d],[e,f,g],[h,i],[j,k,l]], N). N = [4, 3, 2, 3].
结果完全符合预期。
扩展提示
如果需要处理更深层次的嵌套(比如子列表内部还有嵌套列表,需统计所有叶子节点总数),可以修改count_list/2为深度遍历版本:
count_deep([], 0). count_deep([H|T], C) :- is_list(H), count_deep(H, HCount), count_deep(T, TCount), C is HCount + TCount. count_deep([_|T], C) :- \+ is_list(H), count_deep(T, TCount), C is TCount + 1.
但针对你当前的需求,原有的count_list/2已经足够满足场景。
内容的提问来源于stack exchange,提问作者Simon Hall
相关产品推荐
相关产品推荐

