В дополнение к тому, что написал @Mehrdad Afshari, я просто хочу отметить, что на самом деле очень важно, чтобы хвостовая рекурсия (или, в более общем случае, цепочка хвостовых вызовов) могла быть потенциально бесконечной, потому что иначе вы не могли бы написать веб-сервер, операционная система, интерпретатор, REPL или любой другой цикл обработки событий на функциональном языке.
В конце концов, операционная система - это не что иное, как бесконечный цикл, и способ написать цикл на функциональном языке - использовать хвостовую рекурсию. Если бы рекурсия хвоста не была бесконечной, цикл не был бы бесконечным. Следовательно, вы не только не могли бы написать операционную систему, язык даже не был бы законченным по Тьюрингу.
По сути, это то, как вы пишете веб-сервер на функциональном языке:
def loop(queue) = {
// handle first request in queue
loop(queue)
}
Без бесконечной рекурсии хвоста это быстро исчерпало бы память.