/var/log/messages

Jan 21, 2019 - 2 minute read - Comments - programming

プログラミング Elixir (9)

span て見たことないな、と思ったら作っていませんでした。のでそちらから。

ListsAndRecursion - 4

以下で良かった模様。

  def span(to, to), do: [to]
  def span(from, to) do
    [from | span(from+1, to)]
  end

パタンマッチ、強力ですね。

ListAndRecursion - 7

その span を使って素数のリストを、とのこと。これはファイルに作らなくても良いのかどうか。とりあえず、n を 6 くらい、ということにしておいて色々検討してみることに。一回こうして

for x <- [2, 3, 4, 5, 6], do:

do の中で y を作って

for x <- [2, 3, 4, 5, 6], do: for y <- [2, 3, 4, 5, 6], 

フィルタするのですがこうかな?

2 は into 使うのかな。てか、span 使うのでしたね。一緒にしてみるとどうなるか。

iex(7)> for x <- MyList.span(2, 6), y <- MyList.span(2, 6), x > y, do: [x, y]
[[3, 2], [4, 2], [4, 3], [5, 2], [5, 3], [5, 4], [6, 2], [6, 3], [6, 4], [6, 5]]

これ、右側のかたまりでナニしたいのですがどうすりゃいいのかな。こうすると妙なフィルタ? がかかりますね。

iex(8)> for x <- MyList.span(2, 6), do: for y <- MyList.span(2, 6), x > y, do: [x, y]
[
  [],
  [[3, 2]],
  [[4, 2], [4, 3]],
  [[5, 2], [5, 3], [5, 4]],
  [[6, 2], [6, 3], [6, 4], [6, 5]]
]

これ、素数判定する手続き定義しちゃ駄目なのかな。こんなカンジ?

  def prime?(n) do
    if n < 2 do
      false
    else
      if n == 2 do
        true
      else
        if rem(n, 2) == 0 do
          false
        else
          _prime?(3, n)
         end
       end
     end
  end

  defp _prime?(i, n) do
    if i >= n do
      true
    else
      if rem(n, i) == 0 do
        false
      else
        _prime?(i+2, n)
      end
    end
  end

微妙感満点かも。

iex(13)> for x <- MyList.span(2, 6), MyEnum.prime?(x), do: x
[2, 3, 5]

追記

こうなのかな。

  def prime?(n) do
    cond do
      n < 2 -> false
      n == 2 -> true
      rem(n, 2) == 0 -> false
      true -> _prime?(3, n)
  end
  end

  defp _prime?(i, n) do
    cond do
      i >= n -> true
      rem(n, i) == 0 -> false
      true -> _prime?(i+2, n)
    end
  end

どちらにしても作題意図は外してる感満点だったりして。

プログラミング Elixir (8) プログラミング Elixir (10)

comments powered by Disqus