序言:将列表成员与上一个成员相乘

时间:2020-07-01 23:33:54

标签: prolog

%Multiply every list Element with his previous Elemennt.
%First Number stays as it is!
% Example list [1,2,3,4,5,6] becomes [1,2,6,12,20,30].

%my solution trying

vormulti1([],[]).
vormulti1([Kopf|Rest], [Neu|Rest2]) :-
   Neu is Kopf2 * Kopf,
   vormulti1(Rest, Rest2),
   Kopf2 is Kopf.

问题是前一个成员。我用Kopf2变量尝试了ist,但是它不起作用,因为它没有在第一个列表元素上实例化。

2 个答案:

答案 0 :(得分:1)

您不能使用Kopf2,因为您没有在公式中使用它,所以您无法以您希望的方式将其传递给递归。变量是特定公式的局部变量。您需要通过参数获取其他元素,例如:

vormulti1([],[]).
vormulti1([X],[X]).
vormulti1([X,Y|Z],[X|W]) :- vormulti2(X,[Y|Z],W).

vormulti2(X,[],[]).
vormulti2(X,[Y|Z],[V|W]) :- V is X * Y, vormulti2(Y,Z,W).

另一种可能性是先反转列表(这是一种有效的操作),然后可以更轻松地处理列表的结尾:

vormulti1(X,Y) :- reverse(X,Z), vormulti2(Z,W), reverse(W,Y).
vormulti2([],[]).
vormulti2([Kopf], [Kopf]).
vormulti2([Kopf,Kopf2|Rest], [Neu|Rest2]) :- Neu is Kopf2 * Kopf, vormulti2([Kopf2|Rest], Rest2).

祝你好运。

答案 1 :(得分:0)

vormulti1([],[]).

vormulti1([X|[Y]], [X,Z]):- Z is X*Y,!.

vormulti1([H|[H2|T2]],Z) :-
    vormulti1([H2|T2], [_|T3]),!,
    Z2 is H2 * H,
    append([H,Z2], T3, Z).

vormulti1([X],[X]).