/var/log/messages

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

プログラミング Elixir (6)

7 章のリストと再帰、に突入。lisp/scheme なヒトなので、このあたりは慣れている、というか何というか。

未使用の変数

こんなカンジ? って思っていたのですが

  def guess_helper(actual, _.._, center) when actual == center do
    actual
  end

先頭に、でした。

  def guess_helper(actual, _min.._max, center) when actual == center do
    actual
  end

アキュムレータ

以下な定義の total がそれに当たるはず。

defmodule MyList do
  def sum([], total), do: total
  def sum([head | tail], total), do: sum(tail, head + total)
end

こうすりゃいいのかな。

defmodule MyList do
  def sum([]), do: 0
  def sum([head | tail]), do: head + sum(tail)
end

ListsAndRecursion-1

fn て予約語だったよ。以下な書き方したらコンパイルで叱られました。

  def mapsum(list, fn), do: _mapsum(list, 0, fn)

メセジは以下でした。

== Compilation error in file mylist.exs ==
** (SyntaxError) mylist.exs:4: unexpected token: ). The "fn" at line 4 is missing terminator "end"
    (elixir) lib/kernel/parallel_compiler.ex:206: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/6

これでいいのかしらん。

  def mapsum(list, func), do: _mapsum(list, 0, func)
  defp _mapsum([], val, _func), do: val
  defp _mapsum([head | tail], val, func), do: _mapsum(tail, val + func.(head), func)

ListsAndRecursion-2

下書き? してみます。

  • max(list) は _max(list, 0) を呼び出す
  • max([], value) は value を戻す
  • max([head | tail], value) when head > value は max(tail, head) を呼び出す
  • max([head | tail], value) when head <= value は max(tail, value) を呼び出す

でいいのかな。実装以下で動いているみたい?

  def max(list), do: _max(list, 0)
  defp _max([], value), do: value
  defp _max([head | tail], value) when head > value do
    _max(tail, head)
  end
  defp _max([head | tail], value) when head <= value do
    _max(tail, value)
  end

if てのが出てこない、というのもアレゲです。

ListsAndRecursion-3

色々確認を。

iex(13)> [h | t] = 'abcdz'
'abcdz'
iex(14)> t
'bcdz'
iex(15)> [h | t]
'abcdz'
iex(16)> [h+20 | t]
'ubcdz'
iex(17)> [h+25 | t]
'zbcdz'
iex(18)> h+25
122
iex(19)> h
97

検討してみます。

  • caesar(list, n) は _caesar(list, n) を呼び出す
  • _caesar([head | tail], n) when head + n > 122 は [97 + head + n - 122 | _caesar(tail, n)] を戻す
  • _carsar([head | tail], n) when head + n <= 122 は [head + n | _caesar(tail, n)] を戻す

で良いのかどうか。で、実装してみたら動かない。以下が不足してました。

  • _carsar([], n) は [] を戻す

あと、97 じゃなくて 96 に加算、でないと一つずれる。実装以下で

  def caesar(list, n), do: _caesar(list, n)
  defp _caesar([], _n), do: []
  defp _caesar([head | tail], n) when head + n > 122 do
    [96 + head + n - 122 | _caesar(tail, n)]
  end
  defp _caesar([head | tail], n) when head + n <= 122 do
    [head + n | _caesar(tail, n)]
  end

以下が戻りました。

iex(28)> MyList.caesar('ryvkve', 13)
'elixir'

なるほど。

プログラミング Elixir (5) FPGA な環境設定

comments powered by Disqus