Skip to content

Instantly share code, notes, and snippets.

@kyanny
Created March 13, 2012 01:27
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save kyanny/2026028 to your computer and use it in GitHub Desktop.
Save kyanny/2026028 to your computer and use it in GitHub Desktop.
Elixir fibonacci #1
defmodule Fib do
def fib(0) do 0 end
def fib(1) do 1 end
def fib(n) do fib(n-1) + fib(n-2) end
end
IO.puts Fib.fib(10)
@ermanimer
Copy link

ermanimer commented Jul 26, 2023

My take with tail call optimization:

defmodule Fibonacci do
  def nth(n) when n <= 1, do: n

  def nth(n) do
    fib(n - 2, 1, 0)
  end

  defp fib(0, minus_1, minus_2) do
    minus_1 + minus_2
  end

  defp fib(n, minus_1, minus_2) do
    fib(n - 1, minus_1 + minus_2, minus_1)
  end
end

@pmarreck
Copy link

I'd never put my version in lol

#!/usr/bin/env elixir

defmodule Fibonacci do
  def nth([n]) when is_binary(n), do: nth(String.to_integer(n)) 
  def nth(n) when n < 1, do: {:error, :undefined}
  def nth(1), do: 0
  def nth(n), do: nth(1, 0, n - 2)
  def nth(last, _last_last, 0), do: last
  def nth(last, last_last, current), do: nth(last + last_last, last, current - 1)
end

# inline "tests"
0 = Fibonacci.nth(1)
2 = Fibonacci.nth(4)
21 = Fibonacci.nth(9)

IO.puts Fibonacci.nth(System.argv())

@Lawrence-2001
Copy link

Lawrence-2001 commented Aug 1, 2023

defmodule Fibonacci do
  def find(n) do
    list = [1, 0]
    fib(list, n)
  end
  
  def fib(_list, n) when n < 0 do
    []
  end

  def fib(_list, 0) do
    [0]
  end

  def fib(list, 1) do
    list
  end

  def fib(list, n) do
    [first_elem, second_elem | _] = list
    fib([first_elem + second_elem | list], n - 1)
  end
end

10 |> Fibonacci.find() |> IO.inspect()

@Lawrence-2001
Copy link

Lawrence-2001 commented Aug 1, 2023

defmodule Fib do
    def run(a, b, n) do
        case n do
            1 ->
                b
            _ ->
                run(b, a + b, n - 1)
        end
    end
end

Fib.run(0,1,10) |> IO.puts()

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