Prolog 列表序言中的和
我试图在prolog中获得sum+输入列表,但到目前为止没有成功Prolog 列表序言中的和,prolog,Prolog,我试图在prolog中获得sum+输入列表,但到目前为止没有成功 sum([], 0). sum([H|T], [N]):- sum(T, X), N is X + H. 输入 这导致 N = [3] 我想要达到的目标 N = [3,1,2] 假设sum(Xs,Ys)应该构建列表Ys=[sum | Xs],其中sum是列表Xs项的总和,您可以执行以下操作: sum(Xs, [Sum|Xs]) :- sum_rec(Xs, Sum). sum_rec([], 0).
sum([], 0).
sum([H|T], [N]):-
sum(T, X),
N is X + H.
输入
这导致
N = [3]
我想要达到的目标
N = [3,1,2]
假设sum(Xs,Ys)
应该构建列表Ys=[sum | Xs]
,其中sum
是列表Xs
项的总和,您可以执行以下操作:
sum(Xs, [Sum|Xs]) :-
sum_rec(Xs, Sum).
sum_rec([], 0).
sum_rec([X|Xs], Sum):-
sum_rec(Xs, PartialSum),
Sum is X + PartialSum.
更好的方法是使用累加器来计算列表Xs
项的总和:
better_sum(Xs, [Sum|Xs]) :-
better_sum(Xs, 0, Sum).
better_sum([], Acc, Acc).
better_sum([X|Xs], Acc, Sum) :-
NewAcc is Acc + X,
better_sum(Xs, NewAcc, Sum).
结果:
?- sum([1,2], L).
L = [3, 1, 2].
?- better_sum([1,2], L).
L = [3, 1, 2].
?- sum([3,2,7,5], L).
L = [17, 3, 2, 7, 5].
?- better_sum([3,2,7,5], L).
L = [17, 3, 2, 7, 5].
假设sum(Xs,Ys)
应该构建列表Ys=[sum | Xs]
,其中sum
是列表Xs
项的总和,您可以执行以下操作:
sum(Xs, [Sum|Xs]) :-
sum_rec(Xs, Sum).
sum_rec([], 0).
sum_rec([X|Xs], Sum):-
sum_rec(Xs, PartialSum),
Sum is X + PartialSum.
更好的方法是使用累加器来计算列表Xs
项的总和:
better_sum(Xs, [Sum|Xs]) :-
better_sum(Xs, 0, Sum).
better_sum([], Acc, Acc).
better_sum([X|Xs], Acc, Sum) :-
NewAcc is Acc + X,
better_sum(Xs, NewAcc, Sum).
结果:
?- sum([1,2], L).
L = [3, 1, 2].
?- better_sum([1,2], L).
L = [3, 1, 2].
?- sum([3,2,7,5], L).
L = [17, 3, 2, 7, 5].
?- better_sum([3,2,7,5], L).
L = [17, 3, 2, 7, 5].