Erlang与守卫的基本递归

时间:2013-04-16 20:35:58

标签: erlang

我正在尝试创建一个非常简单的递归函数来删除具有用户从列表中决定的特定值的所有元素。

在haskell我会使用警卫并且做:

deleteAll_rec _ [] = []
deleteAll_rec del (x:xs) | del==x = deleteAll_rec del xs
                         | otherwise = x:deleteAll_rec del xs

我正在尝试编写Erlang等效代码,但是,我不知道如何处理otherwise案例:

deleteAll_rec(_, []) -> [];
deleteAll_rec(DEL, [X|XS]) when DEL =:= X -> deleteAll_rec(DEL, XS).

我想知道是否有人可以证明如何做到这一点?

非常感谢提前!

1 个答案:

答案 0 :(得分:5)

否则成为Erlang中的一个单独的子句:

delete_all_rec(_, []) -> [];
delete_all_rec(Del, [Del|Xs]) ->
    delete_all_rec(Del, Xs);
delete_all_rec(Del, [X|Xs]) ->
    [X|delete_all_rec(Del, Xs)].

另一种方法是使用if之类的:

delete_all_rec(_, []) -> [];
delete_all_rec(Del, [X|Xs]) ->
    if Del =:= X ->
            delete_all_rec(Del, Xs);
        true ->
            [X|delete_all_rec(Del, Xs)]
    end.

结果代码是相同的,但我认为第一个版本看起来更好。在这个例子中,无论你将终止案例放在最后还是最后都是无关紧要的,我宁愿把它放在最后。