很可能我无法恰当地表达我的搜索关键词。我要做的是递归地计算列表中连续条目的差异,并继续将它们添加到全局计数器中。最后的挑战是循环子句,因此如果list是[5,4,3,2,1]
,则谓词应该返回(5-4)+(4-3)+(3-2)+(2-1)+(1-5)=0
。
到目前为止,我的情况如下:
circularSumOfDifferences([_],0).
circularSumOfDifferences([E1,E2|List],Sum) :-
Diff is E1-E2,
circularSumOfDifferences([E2|List],SoD),
Sum is Diff+SoD.
现在,我已经考虑过定义另一个谓词,在给定列表的尾部添加列表的第一个元素,并结合查询:copyHeadToTail([5,4,3,2,1],Result),circularSumOfDifferences(Result,C).
调用新的列表。
这是不难理解的,但在我看来并不是很优雅。我想知道是否有一种方法只定义一个谓词circularSumOfDifferences(+L,-SoD)
,该谓词通过列表递归,并在结束(或开始)运行一条语句,用于该子字符串,即1-5
。
发布于 2016-02-07 20:38:49
当然,您可以编写一个谓词,但是您应该注意到,列表中的每个元素X
在总和中出现了两次,一次以X
形式出现,一次以-X
形式出现。无论您给出这个谓词的数字列表,结果始终是0。这是作业吗?很可能重点是注意到这一点,而不是试图计算实际金额:
always_zero([], 0).
always_zero([X|Xs], 0) :-
number(X),
always_zero(Xs, 0).
如果您坚持这样做的话,您可能会想要编写谓词:
circ_sum_of_diff([X|Xs], Sum) :- % must have at least one element I guess?
circ_sum_of_diff_1(Xs, X, X, 0, Sum).
circ_sum_of_diff_1([], Last, First, SoFar, Sum) :-
Sum is SoFar + Last - First.
circ_sum_of_diff_1([X|Xs], X0, First, SoFar0, Sum) :-
SoFar is SoFar0 + X0 - X,
circ_sum_of_diff_1(Xs, X, First, SoFar, Sum).
这使用了一个辅助谓词,这在Prolog程序中很常见。实际上在列表上迭代的辅助谓词有三个额外的参数:列表的解压头、最初的第一个元素(在列表末尾使用)和到目前为止的和。
https://stackoverflow.com/questions/35258273
复制相似问题