如何使用尾递归在序言中实现展平列表?
这是带有简单递归的 flatten/2 代码(即没有回溯的意思):
flatten([], []).
flatten([L|Ls], FlatL) :-
!,
flatten(L, NewL),
flatten(Ls, NewLs),
append(NewL, NewLs, FlatL).
flatten(L, [L]).
?- flatten([1, [2,3], [4]], X).
X=[1,2,3,4].
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用尾递归(累加器)执行相同的算法。例如,谓词sum/2返回列表中所有成员的相加,并带有回溯:
sum([X],[X]).
sum([H|T],S) :- sum(T,S1), S is H + S1 .
Run Code Online (Sandbox Code Playgroud)
与尾递归相同的算法是
sum1(L,S) :- sum1(L,0,S).
sum1([],Acc,Acc).
sum1([H|T],Acc,S) :- Acc1 is Acc+H, s(T,Acc1,S).
Run Code Online (Sandbox Code Playgroud)