Важно отметить, что как глубокая рекурсия, так и цепочки глубоких вызовов принципиально не вызывают переполнение стека.Причиной переполнения является то, что каждый вызов выделяет новый кадр стека, тем самым увеличивая использование пространства стека.
Многие языки допускают произвольно глубокую рекурсию / вызовы с помощью оптимизации хвостовых вызовов.Некоторые языки, такие как ML и Haskell, будут внутренне преобразовывать некоторые (когда вызов находится в конце вызывающей функции) функции / рекурсивные вызовы, чтобы избежать использования дополнительного пространства в стеке, таким образом позволяя эффективно бесконечную рекурсию.Идея заключается в том, что если вызов находится в самом конце вызывающей функции, пространство стека вызывающих функций больше не требуется и может быть возвращено для использования вызываемой функцией.