list - 使用尾递归复制列表中的项目
问题描述
我有一个作业问题,要求我们编写一个谓词,该谓词创建列表中每个项目的副本,首先使用线性递归,然后使用尾递归。我们不能使用内置谓词。
我可以使用线性递归来解决它,但是尾递归有点麻烦。
这是我尝试过的:
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 '放在'列表的左侧,而我应该将它们放在右侧。但是,我没有找到一种方法来做到这一点。
解决方案
您不需要为此任务使用累加器。只需在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
推荐阅读
- selenium - 间歇性 Selenium WebDriver 点击不反映 UI 的变化
- angular - Angular 接口定义键的允许值
- node.js - QLDB 高延迟约 5000 毫秒
- reactjs - Async/Await 不再在我的调度函数中工作
- java - 如何保存复制实体JPA?
- flutter - `ios/Flutter/Flutter.podspec` 有什么作用?
- radio-button - ngModel 单选按钮错过行为
- php - 在列中插入大量数据时,AWS Dynamodb 抛出 500 错误
- javascript - Azure 持久函数 (Node.JS) 错误“Microsoft.Azure.WebJobs.Host:无法将参数‘数据’绑定到类型‘System.String’。”
- python - Pandas:系统日志 - 按位置分组 - 按天计算唯一值