Да, это хвостовая рекурсия. Главное, о чем нужно знать, это если вы заключены в исключения. В этом случае иногда исключение должно существовать в стеке, и это превращает что-то, что выглядит хвостово-рекурсивным во что-то обманчиво, не так.
Оптимизация хвостового вызова применима, если вызов находится в хвостовой позиции. Хвостовая позиция - это «последняя вещь перед тем, как функция вернется». Обратите внимание, что в
fact(0) -> 1;
fact(N) -> N * fact(N-1).
рекурсивный вызов факта не в хвостовой позиции, потому что после вычисления fact(N-1)
необходимо запустить продолжение N * _
(т.е. умножить на N
).