查找差异列表中的最后一项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找差异列表中的最后一项相关的知识,希望对你有一定的参考价值。

我试图找到最后一项(所有数字)而不“破坏”列表。

我现在拥有的是:

max([_|Xs]-Xs,R):-
Xs = [],
max2(Xs,R),!.
max([X|Xs]-Xs,R):-
    R = X.
max([]-[],99999).

Max2是一个查找普通列表中最后一项的函数:

max2([X],X):-
    number(X),!.
max2([_|Xs],R):-
    max2(Xs,R),!.

当我尝试使用一个项目的列表时,它可以工作 - 否则会失败:

max([22|X]-X,R)
R = 22

max([22,27|X]-X,R)
Stack limit (0.2Gb) exceeded
  Stack sizes: local: 0.2Gb, global: 21Kb, trail: 3Kb
  Stack depth: 1,560,328, last-call: 0%, Choice points: 1,560,312
  Probable infinite recursion (cycle):
    [1,560,328] max2([cyclic list], _1452)
    [1,560,327] max2([cyclic list], _1484)

我尝试了其他方法,但是当我给它一个包含一个项目的列表时,它将其转换为:

max([22|X]-X,R)
X = []
R = 22

所以我不能继续使用X作为自由变量。

我希望我写清楚。提前谢谢了。

答案

在Logtalk库中,我使用以下定义:

last(List-Back, Last) :-
    List == Back,
    List = [Head| Tail],
    last(Tail-Back, Head, Last).

last(List, Last, Last) :-
    unify_with_occurs_check(List, Back-Back).
last(List-Back, _, Last) :-
    List == Back,
    List = [Head| Tail],
    last(Tail-Back, Head, Last).

示例电话:

?- last([22|X]-X,R).
R = 22 ;
false.

?- last([a,b,c|X]-X,R).
R = c ;
false.

?- last(DL, Last).
DL = [Last|_1648]-_1648 ;
DL = [_1652, Last|_1648]-_1648 ;
DL = [_1652, _1664, Last|_1648]-_1648 ;
DL = [_1652, _1664, _1676, Last|_1648]-_1648 ;
DL = [_1652, _1664, _1676, _1688, Last|_1648]-_1648
...

这个定义非常通用,因为它也适用于变量列表。例如:

?- last([X,Y,Z|Tail]-Tail, Last).
Z = Last ;
false.

在您的情况下,如果您可以确保差异列表始终格式良好并且其元素是基础的,则可以简化定义。

以上是关于查找差异列表中的最后一项的主要内容,如果未能解决你的问题,请参考以下文章

查找列表中的最后一项[重复]

查找两个文本文件之间的差异,每行一项[重复]

如何通过参数(SQL)查找最后一项? [复制]

Listview 上的最后一项被切断

Python“for in”循环打印列表中的最后一项

ListFragment 仅在带有 ExpandableListadpater 的片段视图中显示第一项