Czy powinienem unikać rekursji ogonowej w Prologu i ogólnie?
Pracuję nad książką online „Learn Prolog now” dla zabawy.
Próbuję napisać predykat, który przechodzi przez każdego członka listy i dodaje do niego jeden, używając akumulatorów. Zrobiłem to łatwo bez rekurencji ogonowej.
addone([],[]).
addone([X|Xs],[Y|Ys]) :- Y is X+1, addone(Xs,Ys).
Ale przeczytałem, że lepiej jest unikać tego typu rekursji ze względu na wydajność. Czy to prawda? Czy uważa się za „dobrą praktykę” używanie rekurencji zawsze? Czy warto będzie korzystać z akumulatorów, aby uzyskać dobry nawyk?
Próbowałem zmienić ten przykład na używanie akumulatorów, ale odwraca listę. Jak mogę tego uniknąć?
accAddOne([X|Xs],Acc,Result) :- Xnew is X+1, accAddOne(Xs,[Xnew|Acc],Result).
accAddOne([],A,A).
addone(List,Result) :- accAddOne(List,[],Result).