該程式的重??點是計算整數串列中所有偶數的總和。
is_even(Q):- Q mod 2 =:= 0.
sum_even([],0).
sum_even([A|L],X) :- sum_even(L,X1) -> is_even(A) -> X is X1 A .
只要 is_even 謂詞成功就沒有問題,它通常會回傳計算總和。但是,當數字不是偶數并且 is_even 檢查它時,它會失敗,回傳到遞回并失敗接下來的所有內容,甚至不檢查數字是否不再是偶數而只是回傳 false。在一個充滿偶數的串列中,它按預期作業,它回傳串列中所有數字的總和。這是代碼的痕跡
uj5u.com熱心網友回復:
使用帶有尾端遞回的累加器是最快的:
is_even(N) :-
N mod 2 =:= 0.
sum_even(Lst, Sum) :-
sum_even_(Lst, 0, Sum).
sum_even_([], Sum, Sum).
sum_even_([H|T], Upto, Sum) :-
( is_even(H) ->
Upto1 is Upto H
; Upto1 = Upto
),
sum_even_(T, Upto1, Sum).
sum_even_slow([], 0).
sum_even_slow([H|T], Sum) :-
sum_even_slow(T, Sum0),
( is_even(H) ->
Sum is Sum0 H
; Sum = Sum0
).
swi-prolog 中的性能比較:
?- numlist(1, 1_000_000, L), time(sum_even(L, Sum)).
% 4,000,002 inferences, 0.765 CPU in 0.759 seconds (101% CPU, 5228211 Lips)
Sum = 250000500000.
?- numlist(1, 1_000_000, L), time(sum_even_slow(L, Sum)).
% 4,000,001 inferences, 4.062 CPU in 4.023 seconds (101% CPU, 984755 Lips)
Sum = 250000500000.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/483637.html
上一篇:否則行內?[復制]
