Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Elixirでトリボナッチ数列の問題を解いてみた(制限時間10分)

はじめに

ハイライト

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. インストールとプロジェクトの作成

  • まずはElixirをインストールしましょう
  • インストールができましたら以下のコマンドでプロジェクトを作ります
$ 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.exshello/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

:tada::tada::tada:

  • IExSystem.haltで終わらせましょう

Wrapping Up

  • お好みの言語でトリボナッチ数列をお楽しみください
  • Enjoy!
fukuokaex
エンジニア/企業向けにElixirプロダクト開発・SI案件開発を支援する福岡のコミュニティ
https://fukuokaex.fun/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away