Использование хвостовой рекурсии для дублирования элементов в списке - PullRequest
2 голосов
/ 16 апреля 2019

У меня есть проблема с домашней работой, которая требует от нас написать предикат, который создает дубликат каждого элемента в списке, сначала используя линейную рекурсию, а затем используя хвостовую рекурсию.Мы не можем использовать встроенные предикаты.

Я мог бы решить это с помощью линейной рекурсии, но у меня возникли небольшие проблемы с хвостовой рекурсией.

Вот что я пытался:

dup_elem_tail([], Res, Res).
dup_elem_tail([P | R], Lst2, Aux) :- dup_elems_tail(R, Lst2, [P, P | Aux]).

Если ввод dup_elem_tail([a, b, c], L).Выход должен быть L = [a, a, b, b, c, c].Вместо этого я получил [c, c, b, b, a, a].

Теперь я знаю, где моя ошибка.В

dup_elem_tail([P | R], Lst2, Aux) :- dup_elems_tail(R, Lst2, [P, P | Aux]).

я «помещаю» две буквы «P» в левую часть списка, когда я должен поместить их в правую часть.Однако я не нахожу способ сделать это.

1 Ответ

0 голосов
/ 17 апреля 2019

Вам не нужно использовать аккумулятор для этой задачи. Просто создайте список вывода в head :

dup_elems_tail([], []).
dup_elems_tail([P| Ps], [P, P | DPs]) :-
    dup_elems_tail(Ps, DPs).

Пример звонка:

| ?- dup_elems_tail([a, b, c], L).                                        

L = [a,a,b,b,c,c]
yes
...