我有能夠計算列表的平均值的代碼,但唯一的問題是它是空列表時出錯。當列表爲空時,我想返回false。任何提示?列表的序列號平均值
avg(List, Avg):-
sum(List, Sum),
length(List, Length),
Avg is Sum/Length.
我有能夠計算列表的平均值的代碼,但唯一的問題是它是空列表時出錯。當列表爲空時,我想返回false。任何提示?列表的序列號平均值
avg(List, Avg):-
sum(List, Sum),
length(List, Length),
Avg is Sum/Length.
當然,除以零通常是不允許的。如果(約定)0元素的平均可以是0的可能校正是
avg(List, Avg):-
sum(List, Sum),
length(List, Length),
( Length > 0
-> Avg is Sum/Length
; Avg is 0
).
編輯我在SWI-Prolog的測試,通過sumlist替換總和/ 2/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.
只需添加一個條件列表不爲空,如:
average(List, Average):-
sum(List, Sum),
length(List, Length),
Length > 0,
Average is Sum/Length.
這將導致斷言失敗,這是因爲平均數是不確定的。
AVG(列表,平均/ 1): -
sumlist(List, Sum),
length(List, Length),
( Length > 0
-> Avg is Sum/Length
; Avg is 0
).
你應該1. 如AVG(列表,平均/ 1)除以平均值。我只是複製了它在上面的評論,並添加avg/2。
可能是sum/2是undefined?或者你的Prolog沒有實現 - >/2?。看到我的編輯... – CapelliC
哦,對不起,最近做了很多Lisp,並且閱讀了';'作爲評論。 – starblue