我在这里有本例中,我用1运行它,[1,2,3,1,4,1]序贯二郎误解
example(_, []) -> [];
example(X, [X | Rest]) -> Rest;
example(X, [Y | Rest]) -> [Y | example(X, Rest)].
在我的头(即附连到我的身体)我得到[2,3,4],但编译器说[2,3,1,4,1]。怎么来的?要么我太累了,要么我不正确地理解这些东西。
帮助表示赞赏!
我在这里有本例中,我用1运行它,[1,2,3,1,4,1]序贯二郎误解
example(_, []) -> [];
example(X, [X | Rest]) -> Rest;
example(X, [Y | Rest]) -> [Y | example(X, Rest)].
在我的头(即附连到我的身体)我得到[2,3,4],但编译器说[2,3,1,4,1]。怎么来的?要么我太累了,要么我不正确地理解这些东西。
帮助表示赞赏!
好吧,由于您的第一个参数与列表头一致,因此使用第二个过载,导致Rest
(即[2,3,1,4,1]
)结束“递归”。一如既往,编译器是正确的;)
也许你想写example(X, [X | Rest]) -> example(X, Rest)
而不是?这确实会删除所有的1
,而不仅仅是第一个。
子句从上到下匹配。
您致电example(1, [1,2,3,1,4,1])
。
首先,erlang会尝试重新匹配(_,[])
。这将失败,因为你的第二个参数不是空列表。
第二场比赛将对阵(X,[X | Rest)
。 X
变为有界1
,所以第二个参数“is”现在是[1 | Rest]
。这将成功与[1,2,3,1,4,1]
进行匹配,因为第一个列表项是1
(值为X
)。
你可以试试:
example(_, []) -> [];
example(X, [X | Rest]) -> example(X, Rest);
example(X, [Y | Rest]) -> [Y | example(X, Rest)].
wy:example(1, [1,2,3,1,1]).
将删除所有elment 1.
这一个为3小时到很晚,提供相比于KRAB和我现有的答案绝对没有其他信息。 – filmor 2014-08-29 07:55:34