所以我有一个硬件问题我已经工作了几天而且我被困在最后一部分。在Prolog中,我应该编写一个包含两个列表的函数 ((x1,x2,...,xn),(y1,y2,... yn)) 并找到两者之间的距离。输出是列表中完成数学运算的结果。 公式:sqrt((x1-y1)(x1-y1)+(x2-y2)(x2-y2)+ ... +(xn-yn)*(xn-yn)) 这是我到目前为止所做的:
distance([],[], 0).
distance([Ha|Ta],[Hb|Tb], Sum) :-
distance(Ta,Tb, Rest),
Sum is sqrt( (Ha-Hb)*(Ha-Hb)) + Rest.
答案 0 :(得分:2)
非常接近。在我的头顶,只需求平方(distance_aux
),然后返回累计和的平方根:
distance(L1, L2, D) :-
distance_aux(L1, L2, SQSUM),
D is sqrt(SQSUM).
distance_aux([],[],0).
distance_aux([Ha|Ta],[Hb|Tb], Sum) :-
distance_aux(Ta,Tb, Rest),
Sum is (Ha-Hb)*(Ha-Hb) + Rest.
您也可以添加简化的规则distance([], [], 0).
,尽管没有必要。
答案 1 :(得分:2)
Prolog有列表,而不是数组。
您的代码未实现显示的公式,因为{/ 1}}必须在产品总和之后计算。在下面的代码中,我还介绍了一个累加器,使循环尾递归(更高效)。
sqrt
根据您的Prolog库,代码可能更简单:
distance(Xs, Ys, Dist) :-
distance(Xs, Ys, 0, Dist).
distance([], [], Acc, Dist) :-
Dist is sqrt(Acc).
distance([X|Xs], [Y|Ys], Acc, Dist) :-
Sum is (Y-X)*(Y-X) + Acc,
distance(Xs, Ys, Sum, Dist).
答案 2 :(得分:0)
你给出的公式将整个求和平方,而不是平均每对夫妇 - 这就是你在代码中所做的。使用辅助解决了这个问题:
distance_sum([], [], 0).
distance_sum([Ha|Ta], [Hb|Tb], Sum) :-
distance_sum(Ta, Tb, Rest),
Sum is ((Ha-Hb) * (Ha-Hb)) + Rest.
distance(A, B, Sum) :- distance_sum(A, B, DSum), Sum is sqrt(DSum).
所以一个例子是:
distance([1,2,3], [4,5,6], Sum).
Sum = 5.196152422706632.
工作:
sqrt( (1-4)*(1-4) + (2-5)*(2-5) + (3-6)*(3-6) )
sqrt( 3*3 + 3*3 + 3*3 )
sqrt( 27 )
5.19615