Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@jeffrade
Created June 11, 2019 14:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jeffrade/e36c39cdfb8d5b10a78532bad71ee5fd to your computer and use it in GitHub Desktop.
Save jeffrade/e36c39cdfb8d5b10a78532bad71ee5fd to your computer and use it in GitHub Desktop.
Tail recursion is optimized way to do recursion in Elixir
defmodule Recursion do
@moduledoc """
Showing how tail recursion is optimized way to do recursion (i.e. no memory loss since function calls not kept on stack).
"""
def correct_tail_recursion_adding([head | tail], accumalator) do
correct_tail_recursion_adding(tail, accumalator + head)
end
def correct_tail_recursion_adding([], accumulator) do
accumulator
end
def non_tail_recursion_adding([head | tail]) do
head + non_tail_recursion_adding(tail)
end
def non_tail_recursion_adding([]) do
0
end
end
Recursion.non_tail_recursion_adding([1, 2, 3, 4, 5])
|> IO.puts()
IO.puts("Above calculation using 'non_tail_recursion_adding' is suboptimal (can run out of memory for very large lists)")
IO.puts("Below calculation using 'correct_tail_recursion_adding' is optimized (each function call is last - \"tail\" - and gc occurs)")
Recursion.correct_tail_recursion_adding([1, 2, 3, 4, 5], 0)
|> IO.puts()
@jeffrade
Copy link
Author

Usage and output:

$ elixir recursion.ex 
15
Above calculation using 'non_tail_recursion_adding' is suboptimal (can run out of memory for very large lists)
Below calculation using 'correct_tail_recursion_adding' is optimized (each function call is last - "tail" - and gc occurs)
15

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment