Как получить 2 последних значения из списка в рекурсии и в хвостовой рекурсии?

Мне нужен предикатlast_two(LST,Y,Z) that assigns the last value of a list to Z and the second-to-last to Y. How can I do it in recursion? and how can I do it in tail-recursion? thanks!

Вот код с хвостовой рекурсией, могу ли я сделать его более эффективным?

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

last2_2([H1,H2],H1,H2).
</code>

Ответы на вопрос(1)

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 элемента за раз (за счет некоторого дополнительного сопоставления с образцом), и нам нужен второй базовый случай для обработки списков нечетной длины.

ВАШ ОТВЕТ НА ВОПРОС