我正在通过“Learn Prolog now”在线书籍来寻找乐趣。
我正在尝试使用累加器编写一个谓词,该谓词遍历列表的每个成员并向其添加一个。我已经很容易做到了,没有尾递归。
addone([],[]).
addone([X|Xs],[Y|Ys]) :- Y is X+1, addone(Xs,Ys).
但我读过,出于性能原因,最好避免这种类型的递归。这是真的?总是使用尾递归是否被认为是“好习惯”?使用蓄能器来养成一个好习惯值得吗?
我试图将此示例更改为使用累加器,但它反转了列表。我怎样才能避免这种情况?
accAddOne([X|Xs],Acc,Result) :- Xnew is X+1, accAddOne(Xs,[Xnew|Acc],Result).
accAddOne([],A,A).
addone(List,Result) :- accAddOne(List,[],Result).