フィボナッチ数列 in Elixir

今日はフィボナッチ数列。20 項目までを出力する。

defmodule Fibonacci do

  def fib(n) do
    fib_iter(0, 1, n, 1)
  end

  defp fib_iter(a, b, n, i) do
    if i > n do
      []
    else
      [a | fib_iter(b, a + b, n, i + 1)]
    end
  end

end

IO.inspect Fibonacci.fib(20)
^o^ > elixir fib.exs
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,
 4181]

上のスクリプトは次のようにも書ける。

defmodule Fibonacci do

  def fib(n), do: fib_iter(0, 1, n, 1)

  defp fib_iter(_, _, n, i) when i > n, do: []
  defp fib_iter(a, b, n, i), do: [a | fib_iter(b, a + b, n, i + 1)]

end

IO.inspect Fibonacci.fib(20)

関数の本体が十分に短ければこっちのほうが見やすいかも。
当然同じ結果になる。

^o^ > elixir fib2.exs
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,
 4181]