我有能够计算列表平均值的代码,但唯一的问题是它是空列表时有错误。我想在列表为空时返回false。任何提示?
avg( List, Avg ):-
sum( List, Sum ),
length( List, Length),
Avg is Sum / Length.
答案 0 :(得分:3)
只需添加列表不为空的条件,例如:
average( List, Average ):-
sum( List, Sum ),
length( List, Length ),
Length > 0,
Average is Sum / Length.
这将导致谓词失败,这是合适的,因为平均值是未定义的。
答案 1 :(得分:2)
当然,通常不允许除以零。如果(按照惯例)0个元素的平均值可以是0,则可能的校正将是
avg( List, Avg ):-
sum( List, Sum ),
length( List, Length),
( Length > 0
-> Avg is Sum / Length
; Avg is 0
).
编辑我在SWI-Prolog中测试过,用sumlist / 2替换sum / 2
avg( List, Avg ):-
sumlist( List, Sum ),
length( List, Length),
( Length > 0
-> Avg is Sum / Length
; Avg is 0
).
试验:
?- avg([1,2,3],X).
X = 2.
?- avg([],X).
X = 0.
编辑对不起,我忽略了空输入列表中需要false
。然后测试Length > 0
是否合适。谓词将失败。
使用库(聚合)的替代方法:
?- L=[1,2,3,4,5], aggregate((count,sum(N)),member(N,L),(Count,SumN)), Ave is SumN/Count.
L = [1, 2, 3, 4, 5],
Count = 5,
SumN = 15,
Ave = 3.
答案 2 :(得分:0)
avg(List,Avg / 1): -
sumlist( List, Sum ),
length( List, Length),
( Length > 0
-> Avg is Sum / Length
; Avg is 0
).
你应该将平均值除以1。 例如avg(List,Avg / 1)。我刚刚在上面的评论中复制了它并添加了avg / 2.