Bat*_*u99 6 recursion default tail-recursion elixir pattern-matching
我在Elixir中写了一个简单的例子,虽然它有效但我真的不明白怎么做.
defmodule MyList do
def sum([],acc \\ 0), do: acc
def sum([head | tail], acc), do: sum(tail,acc + head)
end
Run Code Online (Sandbox Code Playgroud)
当我调用MyList.sum时,我得到了预期的结果
sum([]) => 0
sum([1,2,3]) => 6
Run Code Online (Sandbox Code Playgroud)
我无法在第二个和中添加默认参数,因为编译器会抛出错误
def sum/2 has default values and multiple clauses, use a separate clause for declaring defaults
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,sum([1,2,3])如何运作?它与任何定义都不匹配.该函数仍然是尾递归的吗?
如果您有带可选参数的多重语句,则可以将默认值指定为无主体子句:
defmodule MyList do
def sum(list, acc \\ 0) # sets up default arguments
def sum([],acc), do: acc
def sum([head | tail], acc), do: sum(tail,acc + head)
end
Run Code Online (Sandbox Code Playgroud)
关于你的例子,我只是猜测,但我认为你的代码总是如下:
defmodule MyList do
# implicitly generated due to default argument
def sum(list), do: sum(list, 0)
def sum([],acc), do: acc
def sum([head | tail], acc), do: sum(tail,acc + head)
end
Run Code Online (Sandbox Code Playgroud)
这也是原因sum([1,2,3]).
编辑:该函数绝对是尾递归.如果一个函数做的最后一件事是另一个函数(或它自己)的调用,那么它就是一个尾调用.所以在这种情况下,当我们调用时sum(tail, acc + head),首先计算参数,然后发生尾递归调用.
| 归档时间: |
|
| 查看次数: |
1231 次 |
| 最近记录: |