Recursion 跳过Prolog列表中的N个元素
我是第一次接触Prolog,并且遇到了这个练习。问题是如何定义谓词Recursion 跳过Prolog列表中的N个元素,recursion,prolog,Recursion,Prolog,我是第一次接触Prolog,并且遇到了这个练习。问题是如何定义谓词 everyNth(N, List1, List2) 这样,列表2包含列表1的第一项之后的第一项,以及列表1的第一项之后的第N个元素项 提示是使用append和length 比如说, everyNth (3, [1,2,3,4,5,6,7], List2). List2 = [1,4,7]. everyNth (2, [1,2,3,4,5,6], List2). List2 = [1,3,5]. 我是这样处理这个问题的,到目
everyNth(N, List1, List2)
这样,列表2包含列表1的第一项之后的第一项,以及列表1的第一项之后的第N个元素项
提示是使用append和length
比如说,
everyNth (3, [1,2,3,4,5,6,7], List2).
List2 = [1,4,7].
everyNth (2, [1,2,3,4,5,6], List2).
List2 = [1,3,5].
我是这样处理这个问题的,到目前为止,我只有以下几点:
我不确定我的方向是否正确
everyNth(N, [], L1).
everyNth(N, [H|NL], RL) :-
N > 0,length(NL,N),append(H, NL, RL),everyNth(N,NL,RL).
任何建议或提示都会非常有用
谢谢。我提出以下解决方案
everyNth(_, _, [], []).
everyNth(N, N, [H | Ti], [H | To]) :-
everyNth(N, 1, Ti, To).
everyNth(N, C, [_ | Ti], Lo) :-
C < N,
Cp1 is C+1,
everyNth(N, Cp1, Ti, Lo).
everyNth(N, Li, Lo) :-
everyNth(N, N, Li, Lo).
everyNth(,,[],[])。
每个(N,N,[H|Ti],[H|To]):-
everyNth(N,1,Ti,To)。
everyNth(N,C,[u|Ti],Lo):-
C
我认为你需要两个使用两个数字:第一个是N
并且是固定的;第二个,C
是一个从1
开始,到达N
并再次从1
开始的词;等等因此,everyNth/3
子句只调用everyNth/4
版本。用N
作为计数器调用它,以复制输入列表的第一个元素
当C
等于N
(secondeveryNth/4
)时,将输入列表的标题(H
)复制为输出列表的标题;否则你就把它扔掉
您需要一个terminal子句(
everyNth(u,u,[],[])。
)初始化输出列表(to[]
)。尝试类似的方法
first_and_every_nth_item( _ , [] , [] ) . % empty list? Easy!
first_and_every_nth_item( N , [X|Xs] , [X|Ys] ) :- % take the first item
every_nth_item(1,N,Xs,[],Ys) % then take every nth item from the remainder.
.
every_nth_item(_,_,[],Ts,Ys) :- % if the source list is exhausted, we're good.
reverse(Ts,Ys) % just reverse the accumulator to get the result
. %
every_nth_item(N,M,[_|Xs],Ts,Ys) :- % otherwise...
N < M , % - if N < M
N1 is N+1 , % - increment N
every_nth_item(N1,M,Xs,Ts,Ys) % - and recurse down, discarding the head of the source list.
.
every_nth_item(N,M,[X|Xs],Ts,Ys) :- % otherwise
N = M , % - if N = M
T1 = [X|Ts] % - prepend X to the accumulator
every_nth_item(1,M,Xs,T1,Ys) % - recurse down with the count restarted
. %
第一项和第n项(u、[]、[])的第一项空名单?容易的!
第一项和第N项(N、[X|Xs]、[X|Ys]):-%取第一项
每N个项目(1,N,Xs,[],Ys)%N然后从剩余项目中取出每N个项目。
.
每个第n项(u,,[],Ts,Ys):-%如果源列表已用尽,则我们就可以了。
反转(Ts,Ys)%只需反转累加器即可获得结果
. %
每第N项(N,M,[| Xs],Ts,Ys):-%否则。。。
N