Skip to content

Instantly share code, notes, and snippets.

@madawei2699
Created September 19, 2019 14:40
Show Gist options
  • Select an option

  • Save madawei2699/71d18da3bba4c9dbfc2547d88e6ff297 to your computer and use it in GitHub Desktop.

Select an option

Save madawei2699/71d18da3bba4c9dbfc2547d88e6ff297 to your computer and use it in GitHub Desktop.
fibonacci-algorithms-in-elixir
defmodule Benchmark do
def measure(function) do
function
|> :timer.tc
|> elem(0)
|> Kernel./(1_000_000)
end
end
defmodule Fibonacci1 do
def fibonacci(number) do
Enum.reverse(fibonacci_do(number))
end
def fibonacci_do(1), do: [0]
def fibonacci_do(2), do: [1|fibonacci_do(1)]
def fibonacci_do(number) when number > 2 do
[x, y|_] = all = fibonacci_do(number-1)
[x + y|all]
end
end
Benchmark.measure(fn -> Fibonacci1.fibonacci(10000) end)
0.009856
defmodule Fibonacci2 do
def fib(0), do: 0
def fib(1), do: 1
def fib(n), do: fib(0, 1, n-2)
def fib(_, prv, -1), do: prv
def fib(prvprv, prv, n) do
next = prv + prvprv
fib(prv, next, n-1)
end
end
Benchmark.measure(fn -> IO.inspect Enum.map(0..10000, fn i-> Fibonacci2.fib(i) end) end)
5.50795
defmodule Fibonacci3 do
def fib(0), do: 0
def fib(1), do: 1
def fib(n), do: fib(n-1) + fib(n-2)
end
Benchmark.measure(fn -> Enum.map(0..40, fn i-> Fibonacci3.fib(i) end) end)
7.477463
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment