В общем случае рекурсия это когда функция вызывает саму себя.
Возьмем числа фибоначи: f(x)=f(x-1)+f(x-2), f(0) = 1, f(1) = 1
Erlang код:
```
f(0) -> 1;
f(1) -> 1;
f(X) -> f(X-1)+f(X-2).
```
Это общая рекурсия, она не может быть оптимизирована т.к. результат исполнения зависит от результата исполнения той же функции с другими аргументами. Но данный результат зависит от чего-то еще, поэтому рекурсия не может быть оптимизирована (не хвостовая).
Любой цикл:
```
for i=10 to 1:
do_something
```
loop(0) -> ok;
loop(N) ->
do_something,
loop(N-1).
```
В данном случае рекурсия зовется хвостовой, т.к. результат текущего выполнения функции есть полностью результат выполнения функции для следующей итерации. Т.е. в данном случае компилятор\интерпретатор может не заботиться о том. чтобы отслеживать из какой функции была вызвана текущая функция. Он просто запомнил точку входа в данную рекурсию, и теперь знает что результат самого первого вызова будет результатом самого последнего.
Т.е. другими словами вызов loop(3) будет эквивалентен коду:
```
loop(3),
loop(2),
loop(1),
ok.
```
это обычный линейный код, который никак не является рекурсивным в общем смысле этого слова.