Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 跳过Prolog列表中的N个元素_Recursion_Prolog - Fatal编程技术网

Recursion 跳过Prolog列表中的N个元素

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]. 我是这样处理这个问题的,到目

我是第一次接触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, [], 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
(second
everyNth/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