List 如何在递归和尾部递归中从列表中获取最后两个值?
我需要一个谓词 将列表的最后一个值指定给Z的 最后一个是Y。 如何在递归中实现它?我如何在尾部递归中实现它? 谢谢 这是一个带有尾部递归的代码,我能让它更高效吗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). 这将使每个递归案例更快,模式匹配更少,但会导致它走得太远,并且必须回溯以获
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个元素的问题吗?斯科特·亨特:我为它添加了一个代码,你能检查一下吗?