未初始化变量我试图写一个尾递归方法来计算列表中的未初始化变量的数目。我有点卡住了,我哪里错了。Prolog的尾递归方法来计算列表
我当前的查询是以下:
count([S,L],N) :- var(S), !, N+1.
count([L],N).
未初始化变量我试图写一个尾递归方法来计算列表中的未初始化变量的数目。我有点卡住了,我哪里错了。Prolog的尾递归方法来计算列表
我当前的查询是以下:
count([S,L],N) :- var(S), !, N+1.
count([L],N).
注:这个答案提出了一个解决方案,它是递归的,但不是尾递归。对于尾递归解决方案,您应该使用累加器,这可以从此问题的其他答案中看出。
与任何递归过程,你应该添加适当的基本情况。 在这种情况下,它应该是与返回与未初始化变量的数目统一0空单的条款:
count([], 0).
检查你写的条款。它输入两个元素,而不是表现为头项和尾单的列表清单,它确实没有什么用N:
count([Head|Tail], M):-
var(Head),
!,
count(Tail, N),
M is N+1.
最后,你还应该添加一个条款来处理该情况下,当列表的第一个项目是不是一个非实例变量:
count([_|Tail], N):- count(Tail, N).
没有递归在这里,因为为了有递归,你必须在本身来定义的东西 - 你会发现代码右侧缺少count/2
规则。
% two paths, variable and non-variable
% and a base case to start the count
count([S|L], N) :- var(S), !, count(L, N0), N is N0+1.
count([S|L], N) :- nonvar(S), !, count(L, N).
count([], 0).
或者,这可以简单地findall/3
完成。
count_alt(L, N) :- findall(S, (member(S, L), var(S)), D), length(D, N).
这是一个用于计数列表中变量的尾递归。它使用累加器技术:
count(L, N) :- count(L, 0, N). % L=list, N=count, 0=value of the sum accumulator S
count([], S, S) :- !. % the innermost call, the accumulator S (2nd arg) "copied" to final result (3rd arg)
count([H| T], S, N):- var(H), !, S1 is S+1, count(T, S1, N). % increase accumulator if H is var
count([H| T], S, N):- count(T, S, N). % keep accumulator if H is not var
没有调用在所有子句中都跟随最后的递归调用。
这不是一个尾递归因为递归调用'计数(尾,N)'之后是进一步的目标'M是N + 1'。 – Jiri
@Jini:你是对的!我监督了问题的“尾递归”部分,我只是修正了OP代码。 – gusbro