Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何在递归和尾部递归中从列表中获取最后两个值?_List_Prolog - Fatal编程技术网

List 如何在递归和尾部递归中从列表中获取最后两个值?

List 如何在递归和尾部递归中从列表中获取最后两个值?,list,prolog,List,Prolog,我需要一个谓词 将列表的最后一个值指定给Z的 最后一个是Y。 如何在递归中实现它?我如何在尾部递归中实现它? 谢谢 这是一个带有尾部递归的代码,我能让它更高效吗 last2_2([_|[H1|[H2|T]]],Y,Z):-last2_2([H1|[H2|T]],Y,Z). last2_2([H1,H2],H1,H2). 您可以简化递归情况: last2_2([_|T],X,Y) :- last2_2(T,X,Y). 这将使每个递归案例更快,模式匹配更少,但会导致它走得太远,并且必须回溯以获

我需要一个谓词 将列表的最后一个值指定给Z的 最后一个是Y。 如何在递归中实现它?我如何在尾部递归中实现它? 谢谢

这是一个带有尾部递归的代码,我能让它更高效吗

last2_2([_|[H1|[H2|T]]],Y,Z):-last2_2([H1|[H2|T]],Y,Z).

last2_2([H1,H2],H1,H2).

您可以简化递归情况:

last2_2([_|T],X,Y) :- last2_2(T,X,Y).
这将使每个递归案例更快,模式匹配更少,但会导致它走得太远,并且必须回溯以获得最后2个元素。由于回溯的数量与列表的长度无关,因此当列表变长时,这可能会带来更多的好处

您可以更进一步,将递归案例替换为:

last2_2([_,_|T],Y,Z):-last2_2(T,Y,Z).
last2_2([_,A,B],A,B).

在这里,递归案例一次剥离2个元素,而代价是更多的模式匹配,我们需要第二个基本案例来处理奇数长度列表。

您尝试了什么?例如,你能解决最后一个元素而不是最后2个元素的问题吗?斯科特·亨特:我为它添加了一个代码,你能检查一下吗?