Стоит ли избегать хвостовой рекурсии в Прологе и вообще?
Я работаю над онлайн-книгой "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).