Я работаю над онлайн-книгой "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).