我在這裏有本例中,我用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