如何總結所有奇數定位的元素列表中的Prolog總結列表中的所有數字。
例如[1,2,3,4,5,6,7,8,9] = 25
odd([],0].
odd([Z],Z).
odd([X,Y|T], Sum+1):- odd(T,Sum).
但它返回箱+ 3 + 5 + 7 + 9。
如何總結所有奇數定位的元素列表中的Prolog總結列表中的所有數字。
例如[1,2,3,4,5,6,7,8,9] = 25
odd([],0].
odd([Z],Z).
odd([X,Y|T], Sum+1):- odd(T,Sum).
但它返回箱+ 3 + 5 + 7 + 9。
當你寫Sum+1
你構造什麼是仿函數'+'/2
和參數Sum
和1
的術語。
在Prolog中,當您要計算總和時,您需要使用謂詞is/2
。
在你的代碼,你也應該增加削減消除不必要的choicepoints,並添加X
的總和的休息,不1
:
odd([],0) :- !.
odd([Z],Z) :- !.
odd([X,_|T],Sum):- odd(T,Sum0), Sum is Sum0+X.
使用蓄能器將允許您使代碼tail-遞歸...
在序言中,當您要評估算術表達式時,必須使用is
運算符。由於您在計算範圍外使用+
符號,因此不會專門進行解釋。這似乎是家庭作業,所以我給一個簡化的例子:
add(A, B, C) :- C is A + B.
上面的代碼添加A
和B
並將結果存儲在C
。
奇數([],0]。 奇數([Z],Z)。 ([X,Y | T],Sum): - Sum1是Sum + X,odd(T,Sum1)。這是正確的,但我得到錯誤將運行程序。 – user236501
獲取與奇數元素列表,然後總結該列表:
divide([], [], []).
divide([H|T], [H|L1], L2) :- divide(T, L2, L1).
sum(L, Sum) :- sum(L, 0, Sum).
sum([], Acu, Acu).
sum([H|T], Acu, Acu1) :-
Acu2 is Acu + H,
sum(T, Acu2, Acu1).
sum_odd(L, Sum) :-
divide(L, Odds, _),
sum(Odds, Sum).
:- sum_odd([1,2,5,6,8,9,1], Sum), writeln(Sum).
sum([],0).
sum([H|T],N) :-
sum(T,M), N is H + M.
我用你的方法得到了虛假的回報。謝謝 – user236501
我忘了第三項中的'Sum'參數。感謝您通知我。我編輯了答案。 – twinterer