我的列表中包含较小的列表,每个列表包含2个项目:
[[a,1],[b,2],[c,3]]
我正在使用一个名为take(1,L,R)的函数来获取列表L中的第一项并返回项目R. take函数的代码在这里:
take(0,X,X).
take(N,[H|T],[H|R]):-
N>0, M is N-1,
take(M,T,R).
目前,运行可能如下所示:
1 ?- take(1,[[a],[b],[c]],Taken).
Taken = [[a], [b], [c]]
与输入相同!对于“常规”1级深度列表,这是相同的:
2 ?- take(1,[a,b,c],Taken).
Taken = [a, b, c]
问题:
你的问题是如何让结果看起来像:
1 ?- take(1,[[a],[b],[c]],Taken).
Taken = [a]
我想返回我发送的列表中的前N项。
答案 0 :(得分:0)
你的基本情况take(0, X, X).
完全正如它所说 - 给定任何值X,结果是X.我认为你想说的是take(1, [H|T], H).
(它产生的第一个元素是列表)。
我认为你实际上是take(0, _, [ ]).
,当从任何列表中“取”0项时会产生一个空列表。这适用于您现有的递归案例。
你说你想得到“列表的前N项” - 这样的结果必须存储在N个项目的列表中。因此,take(1, [a, b, c], Taken)
会产生Taken = [a]
,而不是Taken = a
。同样,take(1, [[a], [b], [c]], Taken).
会产生Taken = [[a]].
。对于特殊情况,take(1,...)表单仅返回第一个项目(不包含在列表中)会破坏您的递归。