erlang中空列表和未绑定变量之间的区别?

时间:2014-09-19 10:04:59

标签: erlang tail-recursion

max([H|T]) -> max2(T, H).        %% find the maximum of a list
max2([], Max) -> Max;
max2([H|T], Max) when H > Max -> max2(T, H);
max2([_|T], Max) -> max2(T, Max).

如果你看一下这个函数的第二行和最后一行,就会有点混乱。 第二行说:“如果头部是空列表,则返回尾部”。

最后一行说:“???”。

如果头部未绑定,那么什么?

基本上,我想弄清楚的是 - 空列表和未绑定变量之间是否存在差异,或者它们是否相同?

2 个答案:

答案 0 :(得分:3)

空列表[]将仅在空列表上进行模式匹配。未绑定的_将匹配任何内容。所以,上面的第二行说,“我们已完成列表的递归,因此输出Max”。

底部的两行是:

max2([H|T], Max) when H > Max -> max2(T, H);

上面的一句话说,“如果头部大于当前最大值,那就让头部最大化并继续前进”

max2([_|T], Max) -> max2(T, Max).

然后这一行说,“否则,头部小于当前最大值,所以继续使用当前最大值(我们通过使用_忽略头部”)

在erlang中,重载函数按从上到下的顺序调用。因此,如果顶部的函数存在模式匹配,则不会调用底部的函数。它有点像递归if...else if...else结构。

答案 1 :(得分:2)

第二行实际上说“如果tail是空列表,......”,而不是head,因为您将tail作为第一个参数传递给max2。< / p>

最后一行表示当列表中的下一个元素不大于当前max时,只需忽略它并使用剩余列表和当前max2调用max