我有一个作业问题,要求我们编写一个谓词,该谓词创建列表中每个项目的副本,首先使用线性递归,然后使用尾递归。我们不能使用内置谓词。
我可以使用线性递归来解决它,但是我在尾部递归时遇到了一些麻烦。
这是我尝试过的:
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放在右侧时,我将它们“放在”列表的左侧。但是,我没有找到一种方法。
答案 0 :(得分:0)
您无需为此使用累加器。只需在 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