2012-05-06 52 views
0

我需要一個謂詞last_two(LST,Y,Z) ,它將列表的最後一個值賦給Z ,倒數第二個賦給Y. 如何在遞歸中做到這一點?以及如何在尾遞歸中做到這一點? 謝謝!如何從遞歸和尾遞歸列表中獲取最後2個值?

這是一個帶尾遞歸的代碼,我可以使它更有效嗎?

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

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

你有什麼嘗試?例如,你能解決問題的最後一個(而不是最後2個)元素嗎? –

+0

#Scott Hunter:我爲它添加了一個代碼,你能檢查出它嗎? –

回答

0

您可以簡化遞歸情況:

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個元件在一個時間(在一些更模式匹配的費用),和我們需要第二個基本情況來處理奇數長度的列表。