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).
如果你看一下这个函数的第二行和最后一行,就会有点混乱。 第二行说:“如果头部是空列表,则返回尾部”。
最后一行说:“???”。
如果头部未绑定,那么什么?
基本上,我想弄清楚的是 - 空列表和未绑定变量之间是否存在差异,或者它们是否相同?
答案 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
。