序言欧几里得广场

时间:2018-12-13 20:41:58

标签: prolog tail-recursion euclidean-distance

我编写了一个程序,对于两个相等的数组X和Y,应计算SUM((X-Y)*(X-Y))。但是它只返回false:

euclidsqr([],[],ED).
euclidsqr([X|Xs],[Y|Ys],ED) :- euclidsqr(Xs,Ys,ED),ED is (X-Y)*(X-Y).

1 个答案:

答案 0 :(得分:2)

这里有三个问题:

您的两个空列表的版本应使用0而不是ED统一第二个参数,因为它仍然是一个 free 变量,因此:

euclidsqr([], [], 0).

您还使用ED来统一结果(在子句的开头),但是在递归调用中(在列表的尾部)使用相同的变量,此外,您不对结果进行求和递归调用的结果,用(X-Y)*(X-Y)

euclidsqr([X|Xs], [Y|Ys], ED) :-
    euclidsqr(Xs, Ys, ED1),
    ED is ED1 + (X-Y)*(X-Y).

或将其放在一起:

euclidsqr([], [], 0).
euclidsqr([X|Xs], [Y|Ys], ED) :-
    euclidsqr(Xs, Ys, ED1),
    ED is ED1 + (X-Y)*(X-Y).