2

所以我明天有这个作业。我必须过滤列表的每个第 n 个元素并将其作为列表返回。例如:

?- 每Nth(3,[a,b,c,d,e,f],Rs)。Rs = [c,f]。

我的想法基本上是:

everynth(N, [X|Xs], L) :- everynth(N, [X|Xs], N, L).
everynth(N, [], C, L).
everynth(N, [X|Xs], 0, [X]) :- everynth(N, Xs, N, [X]).
everynth(N, [X|Xs], C, L) :- C1 is C -1,
  everynth(N,Xs,C1,L).

但它不能以这种方式工作,因为在第三行它试图匹配 X 和返回 X 和 Count 0 第二次去那里。

4

2 回答 2

3

你快到了。检查这些修改:

everynth(N, L, NL) :- everynth(N, L, N, NL).

everynth(_, [], _, []).
everynth(N, [X|Xs], 1, [X|NXs]) :- everynth(N, Xs, N, NXs).
everynth(N, [_|Xs], C, NXs) :- C1 is C-1, C1>0,
  everynth(N,Xs,C1,NXs).

第一个子句everynth/4是递归的终止。当输入列表中没有更多项目时,它应该给出一个空列表。

第二个子句everynth/4处理第 n 个项目,它必须将输入项目放在输出列表中,并继续处理剩余的项目,重新启动你的项目计数器。

第三个子句everynth/4处理不是第 n 个元素的项目,因此您必须跳过该项目,递减计数器并继续处理剩余的项目。

于 2012-07-10T14:58:51.357 回答
1
everynth(_, _, [], R, R).
everynth(1, M, [X|Xs], Z, R) :- append(Z, [X], Z1),  everynth(M, M, Xs, Z1, R).              
everynth(N, M, [_|Xs], Z, R) :- N > 1, N1 is N - 1, everynth(N1, M, Xs, Z, R).




?- everynth(3, 3, [a,b,c,d,e,f], [], Rs).
Rs = [c, f] .
于 2012-07-10T15:04:29.737 回答