Знайомство з Erlang [4]

У функціональних мовах програмування немає циклів,
натомість існує рекурсія - це коли функція викликає саму себе.

Хвостова рекурсія - це коли рекурсія викликається останньою інструкцією,
таким чином стек залишається незмінним (або ж практично незмінним) і функція може працювати перманентно без зупинки.

Розглянемо функції обчислення факторіалу:

%factorial - func1
func1(0) -> 1;
func1(N) ->
  N * func1(N-1).
    
%factorial - func2
func2(N) -> func2(N,1).
func2(0,A) -> A;
func2(N,A) when N > 0 -> func2(N-1, N*A).

func1 - це рекурсія без хвостої оптимізації,
тобто з "розбуханням" стеку --
чим більше операцій рекурсії - тим більше займе пам'яті дана програма при виконанні;

func2 - хвостова рекурсія, незалежно від кількості операцій - в пам'яті залишаються лише два числа.

Продовження