【发布时间】:2019-06-09 18:15:25
【问题描述】:
有没有更快的方法在 swi-prolog 中实现这两个功能,以节省时间和内存?
insert(Ind,List,Val,NList) :-
nth0(Ind,List,_,R),
nth0(Ind,NList,Val,R).
build(X,N,List) :-
length(List,N),
maplist(=(X),List).
解释:第一个在列表的第 N 个位置插入一个值,第二个构建一个包含 N 个元素的列表,所有元素都等于数字 X
编辑:我想出了一种方法来改进我的程序的插入
insert(Ind,List,NList,R,Elem) :-
Valb=Val,
Val is Val+1,
nth0(Ind,NList,Val,R),
Elem=Valb.
这应该将列表中的元素替换为其值加 1 ,但还应在加 1 之前返回先前的值(Valb)。我知道代码是错误的,如果不再次使用 nth0,我怎么能使它正确?
【问题讨论】:
-
两者都是O(n)。就时间复杂度而言,没有。您可以通过同时迭代两个列表来更高效地实现前者。
-
build(a,N,[b|_])循环,在更好的实现中可能会失败
标签: prolog