我正在阅读“立即学习 Prolog”在线书籍,以获取乐趣。
我正在尝试编写一个谓词,该谓词遍历列表的每个成员并向其添加一个,使用累加器。我已经在没有尾递归的情况下轻松完成了。
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).