recursion - 在序言递归中将元素一一添加到新列表中
问题描述
给定add(X,InputList,OutputList)
whereOutputlist
是来自 的 X 元素的序列InputList
。我们读取InputList
元素的数量并添加元素,Outputlist
直到达到 X 个元素。
我曾尝试使用该成员,然后尝试附加元素,但我似乎无法弄清楚如何返回新列表也使大小获得输入列表的大小
size([],0).
size([H|T],N) :- size(T,N1), N is N1+1.
append2([], List2, List2).
append2([H|T], List2, [H|Result]) :- append2(T, List2, Result)
实际结果应该是这样的
add(4, [1,2,3], X)
(0, [a,b,c,d], X).
这些失败了
add(0,[q],[q]).
add(3,[a,b,z,c],[a,b,c]).
解决方案
我很高兴您尝试使用库谓词来完成这项任务。例如,您可以执行以下操作:
add(N, List, Prefix) :-
length(Prefix, N),
append(Prefix, _, List).
这实际上是说,“前缀是长度为 N 的列表,可以附加到某物或其他东西以产生输入列表。” 当然,您没有理由费心实现自己的版本,length/2
因为append/3
它们是 ISO。
如果你想手动完成,你可以通过案例分析和 using 来完成succ/2
,看起来像这样:
add(0, _, []).
add(N, [X|Xs], [X|Result]) :-
succ(N0, N),
add(N0, Xs, Result).
通常,调用这个谓词是take/3
因为它好像 OutputList 只是从 InputList 中获取 N 个元素的结果。
推荐阅读
- javascript - setattribute 不会更改内容文档?
- rename - 如何修复 Windows 10 上失败的纱线安装
- python-3.x - 带有 pygsheets 的 AWS Lambda Python 函数导致 [Errno 97] 地址系列不受协议支持
- vue.js - Vuetify 如何将样式添加到 v-checkbox 内的标签
- xamarin.android - 来自 url 的 BottomNavigationView 菜单项图像
- laravel - 为什么我们在使用 session 时在 laravel 中使用 session() 方法?
- javascript - react-hook-form 为什么数字输入类型忽略maxLength?
- html - CSS v. 使用 PNG 作为投影
- python - 如何使用 python panda 仅打印到 Excel 工作表中的一列
- javascript - 如何将 2 个 JS 文件连接到 index.html [reactjs]