Created
June 11, 2019 14:11
-
-
Save jeffrade/e36c39cdfb8d5b10a78532bad71ee5fd to your computer and use it in GitHub Desktop.
Tail recursion is optimized way to do recursion in Elixir
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Usage and output: