Skip to content

Instantly share code, notes, and snippets.

@wulymammoth
Last active January 7, 2022 04:14
Show Gist options
  • Save wulymammoth/c7c7bcccc7296b289a345c7499833329 to your computer and use it in GitHub Desktop.
Save wulymammoth/c7c7bcccc7296b289a345c7499833329 to your computer and use it in GitHub Desktop.
nth-Fibonacci (in elixir) : naive and TCO (tail-call optimized)
# naive will not work for larger values of N
defmodule FibNaive do
def n(0), do: 0
def n(1), do: 1
def n(2), do: 1
def n(n), do: n(n - 1) + n(n - 2)
end
# tail-call optimized (employing dynamic programming)
defmodule FibTailCall do
def n(n) when n <= 1, do: n
def n(n), do: fib(n, 2, {0, 1})
# base case
defp fib(n, count, {minus_2, minus_1}) when n == count do
minus_2 + minus_1
end
defp fib(n, count, {minus_2, minus_1}) do
fib(n, count + 1, {minus_1, minus_2 + minus_1})
end
end
assert FibTailCall.n(0) == 0
assert FibTailCall.n(1) == 1
assert FibTailCall.n(2) == 1
assert FibTailCall.n(3) == 2
assert FibTailCall.n(4) == 3
assert FibTailCall.n(5) == 5
assert FibTailCall.n(15) == 610
assert FibTailCall.n(20) == 6765
assert FibTailCall.n(50) == 12_586_269_025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment