はじめに
- @keisuke_oyatu さんのRubyでトリボナッチ数列の問題を解いてみた(制限時間10分)を拝見しまして、私はぜひElixirでやってみようとおもいました
-
Elixirは
Elixir 1.10.3 (compiled with Erlang/OTP 23)
を使いました
ハイライト
lib/tribonacci.ex
defmodule Tribonacci do
def number(n), do: do_number(n, {1, 3, 7})
defp do_number(n, {n_3, _, _}) when n <= 0, do: n_3
defp do_number(n, {n_3, n_2, n_1}) do
do_number(n - 1, {n_2, n_1, n_3 + n_2 + n_1})
end
end
0. インストールとプロジェクトの作成
$ mix new tribonacci
$ cd tribonacci
1. ソースコードを書く (その1)
lib/tribonacci.ex
defmodule Tribonacci do
@doc """
Tribonacci number.
## Examples
iex> Tribonacci.number(0)
1
iex> Tribonacci.number(1)
3
iex> Tribonacci.number(2)
7
iex> Tribonacci.number(3)
11
iex> Tribonacci.number(4)
21
"""
def number(0), do: 1
def number(1), do: 3
def number(2), do: 7
def number(n), do: number(n - 3) + number(n - 2) + number(n - 1)
end
-
## Examples
のコメント部分はDoctestと呼ばれるものでテストができます
$ mix test
-
mix new
したときに元からできているhello/0
関数はこの記事では消していますが、そのまま残していてもかまいません -
test/tribonacci_test.exs
にhello/0
関数のテストがありますので、hello/0
関数を消した場合には消すなり、気にしないことにするなりしてください
50番目(インデックス49)を求めてみましょう
$ iex -S mix
iex> Tribonacci.number(49)
- 私のパソコンでは計算に時間がかかって待ちきれませんでした
-
Ctl+C
を2回押して強制終了しましょう
2. ソースコードを書く (その2)
lib/tribonacci.ex
defmodule Tribonacci do
@doc """
Tribonacci number.
## Examples
iex> Tribonacci.number(0)
1
iex> Tribonacci.number(1)
3
iex> Tribonacci.number(2)
7
iex> Tribonacci.number(3)
11
iex> Tribonacci.number(4)
21
"""
def number(n), do: do_number(n, {1, 3, 7})
defp do_number(n, {n_3, _, _}) when n <= 0, do: n_3
defp do_number(n, {n_3, n_2, n_1}) do
do_number(n - 1, {n_2, n_1, n_3 + n_2 + n_1})
end
end
- テストがあるので修正が正しいことを確かめられます
$ mix test
- Doctestの部分がパスしていることでしょう
あらためて50番目(インデックス49)を求めてみましょう
$ iex -S mix
iex> Tribonacci.number(49)
17079382868243
-
IEx
はSystem.halt
で終わらせましょう
Wrapping Up
- お好みの言語でトリボナッチ数列をお楽しみください
- Enjoy!