如何在不使用递归的情况下访问列表的前两个元素?
例如:如果我有一个列表(X1,X2,X3,X4,X5)
我想做X1 * X2 + X2 * X3 + X3 * X4 + X4 * X5 + X5 * X1
是正确的吗?
List([X|Y,List],Sum):- ListAcc([Y,List],0,Sum).
ListAcc([X|Y,List],Acc,Sum):-NewAcc is Acc+ X*Y, ListAcc([Y,List],NewAcc,Sum).
ListAcc[[],Acc,Sum).
那是合法的吗?
(而且我不确定如何添加(X5 * X1)的总和
答案 0 :(得分:2)
要像这样访问列表的前两个元素
?- L = [a,b,c,d], [X,Y|Rest] = L.
L = [a, b, c, d],
X = a,
Y = b,
Rest = [c, d].
关于你的第二个问题:
List
应为list
。listAcc([],Sum, Sum)
,但我认为在这种情况下,对于包含单个元素的列表,您应该有一个特殊规则。listAcc(+NumbersLeft, +First, +Acc, -Sum)
。[X1]
的总和应为0或X1*X1
?答案 1 :(得分:0)
使这一点与众不同的是,你必须记住第一项,将它与最后一项相乘。
ListAcc([H1, H2|T], Sum) :-
# We need to remember the first element.
ListAcc([H1,H2|T], Sum, H1).
ListAcc([Hz|[]], Sum, H1) :-
# We reached the last element,
# so we multiply with the first element which we rememebered.
Sum is H1 * Hz.
ListAcc([H1, H2|T], Sum, H) :-
# We calculate the listacc of the rest...
ListAcc([H2|T], Sum1, H),
# ...then we add the product of the first and the second element.
Sum is Sum1 + H1 * H2.