【问题标题】:List help in Erlang在 Erlang 中列出帮助
【发布时间】:2013-11-12 13:03:59
【问题描述】:

您好,我正在尝试编写一个函数,该函数返回一个列表,其中仅包含列表的唯一元素,例如。 [1,2,3,1,1,2,3,4,5,5,1] -> [1,2,3,4,5]

唯一的问题是我不能使用除我正在编写的这个函数之外的任何其他函数(不允许)。

所以:

unique([H|T]) -> 有什么想法吗?

(与递归有关)

【问题讨论】:

标签: list recursion erlang


【解决方案1】:

没有库函数的短篇:

unique(L) -> unique (L,[]).

unique([],R) -> R;
unique([H|Q],R) ->
    case [Y || Y <- Q, Y =:= H] of
        [] -> unique(Q,[H|R]);
        _  -> unique(Q,R)
    end.

我使用了 =:= 比较,因此 1 和 1.0 被认为是不同的。

【讨论】:

    【解决方案2】:

    非常不言自明,一个查找辅助函数,用于进行唯一检查。

    check_unique(List) ->
        check_unique(List, []).
    
    check_unique([H|T], Acc) ->
        case find(H, Acc) of
        true ->
            check_unique(T, Acc);
        false ->
            check_unique(T, Acc ++ [H])
        end;
    check_unique([], Acc) ->
        Acc.
    
    find(E, [E|_]) ->
        true;
    find(E, [_|T]) ->
        find(E, T);
    find(_E, []) ->
        false.
    

    【讨论】:

      【解决方案3】:

      不是最快的实现,但很简单。

      unique(L) -> unique(L, []).
      
      unique([], UL) -> UL;
      unique([H|T], UL) ->
          case lists:member(H,UL) of
              true ->
                  unique(T, UL);
              false ->
                  unique(T, [H|UL])
          end.
      

      该函数反向生成列表。您可以拨打lists:reverse()

      1> test:unique([1,2,3,1,2,3]).
      [3,2,1]
      2> test:unique([1,2,3,1,1,2,3,4,5,5,1]).
      [5,4,3,2,1]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 2014-11-09
        • 2011-07-06
        • 1970-01-01
        • 2010-11-27
        • 2011-01-26
        • 1970-01-01
        相关资源
        最近更新 更多