Last active
January 7, 2022 04:14
-
-
Save wulymammoth/c7c7bcccc7296b289a345c7499833329 to your computer and use it in GitHub Desktop.
nth-Fibonacci (in elixir) : naive and TCO (tail-call optimized)
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
# 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