首页 > 解决方案 > 使用尾递归复制列表中的项目

问题描述

我有一个作业问题,要求我们编写一个谓词,该谓词创建列表中每个项目的副本,首先使用线性递归,然后使用尾递归。我们不能使用内置谓词。

我可以使用线性递归来解决它,但是尾递归有点麻烦。

这是我尝试过的:

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 '放在'列表的左侧,而我应该将它们放在右侧。但是,我没有找到一种方法来做到这一点。

标签: listprologtail-recursionaccumulator

解决方案


您不需要为此任务使用累加器。只需在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

推荐阅读