Prolog汇总列表中的所有数字。

时间:2011-11-09 11:47:05

标签: list 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).

但它返回1 + 3 + 5 + 7 + 9。

4 个答案:

答案 0 :(得分:3)

在prolog中,当您想要计算算术表达式时,必须使用is运算符。由于您在算术范围之外使用+符号,因此不会对其进行特殊解释。这似乎是家庭作业,所以我将举一个简化的例子:

add(A, B, C) :- C is A + B.

上面的代码添加了AB,并将结果存储在C

答案 1 :(得分:2)

撰写Sum+1时构建的内容是带有仿函数'+'/2和参数Sum1的术语。

在Prolog中,当您想要计算总和时,需要使用谓词is/2

在您的代码中,您还应添加剪切以删除不必要的选择点,并将X添加到总和的其余部分,而不是1

odd([],0) :- !.
odd([Z],Z) :- !.
odd([X,_|T],Sum):- odd(T,Sum0), Sum is Sum0+X.

使用累加器可以让代码尾递归......

答案 2 :(得分:0)

获取包含奇数元素的列表,然后对该列表求和:

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).

答案 3 :(得分:0)

sum([],0).
sum([H|T],N) :-
       sum(T,M), N is H + M.