所以我有这个功课应该是tommorow。我必须过滤列表中的每个第n个元素并将其作为列表返回。例如:
? - everyNth(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以及第二次它与第0次匹配。
答案 0 :(得分: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个元素的项目,因此你必须跳过该项目,递减计数器并继续剩下的项目。
答案 1 :(得分: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] .