为了节省时间和内存,是否有更快的方法在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的情况下正确设置代码?
答案 0 :(得分:0)
就时间复杂度而言,它们都在 O(n)时间和 O(n)内存中工作。您不能在少于 O(n)时间的时间内用 n 个元素构造一个列表,它将至少需要 O(n)个内存。可以懒惰地构造列表,从而推迟创建,但是对于真实列表,在时间复杂度方面。
但是,我们可以做的是“合并”这两个谓词的逻辑,以便我们对每个递归调用做更多的事情,例如:
idBuildingsInfo
因此,我们基本上构造了一个特殊的谓词,以相同的谓词执行这两个任务(构造长度为buildings_id
的列表,并将所有元素设置为build(X,N,List) :-
var(N),
!,
build_gen_(List, X, N).
build(X, N, List) :-
integer(N),
!,
build_num_(N, List, X).
build_gen_([], _, 0).
build_gen_([X|T], X, N) :-
build_gen_(T, X, N1),
N is N1 + 1.
build_num_(0, [], _) :-
!.
build_num_(N, [X|T], X) :-
N > 0,
N1 is N-1,
build_num_(N1, T, X).
)。
我将第一个谓词N
专门化为练习。