2016-09-19 1 views
0

私はProgramming Elixirの本を読んで演奏しています。私は、数値の代わりに[]というリストの合計値を返すことを望む合計関数を持っていますが、bad argument in arithmetic expressionが得られます。いくつかの方向性を持っていますか?エリクサーでリストを返すにはどうすればいいですか?

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

答えて

3

問題はMymod.sum/1リストを返し、あなたは数にそれを追加しようとしているということです。

それを動作させるために、あなたは数にsumによって返されたリスト「を発表」し、それを追加する必要がありますが:

defmodule Mymod do 
    def sum([]), do: [] 
    def sum([head | tail]) do 
    case sum(tail) do 
     [] -> [head] 
     [s] -> [head + s] 
    end 
    end 
end 

IO.inspect Mymod.sum([5, 6, 7]) 
#⇒ [18] 

末尾再帰的バリアントは@theanhによって答えに触発された(ようになります。 -le):

defmodule Mymod do 
    def sum(list, acc \\ 0) 

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

IO.inspect Mymod.sum([5, 6, 7]) 
#⇒ [18] 
+0

Upvoted。 – Bala

+0

正しい答えがあればそれを選択し、緑色で印をつけます。 – mudasobwa

+0

アキュムレータを使用せずに方法を見つけようとしますが、それでもやります。 – Bala

1

あなたのコードは非常にきれいにするこれを行うにはtail recursiveを使用することができます方法はあり:

defmodule MyMod do 
    def sum([]), do: [] 
    def sum(list) do 
    do_sum(0, list) 
    end 

    defp do_sum(current_sum, []), do:[current_sum] 
    defp do_sum(current_sum, [head | tail]) do 
    new_sum = current_sum + head 
    do_sum(new_sum, tail) 
    end 
end 

IEX:正確な問題を浮き彫りに答えの最初の行のための

iex()> MyMod.sum([5,6,7]) 
[18] 
+1

テール再帰のためにUpvoted;この回答には1つの不具合があります:空リストのために予期しない '[0]'を返す一方、OPは空のリストを返しました。追加の 'defp do_sum(0、[])、do:[]'が必要です。 – mudasobwa

+0

右。忘れました。たくさんありがとう – TheAnh

関連する問題