【问题标题】:Erlang - element and listErlang - 元素和列表
【发布时间】:2011-12-15 17:11:41
【问题描述】:

我是二郎的新手。我想知道如何编写一个返回列表中前 N 个元素的函数?

我试过了:

    take([],_) -> [];
    take([H|T],N) when N > 0 -> take([H,hd(L)|tl(T)], N-1);
    take([H|T],N) when N == 0 -> ... (I'm stuck here...)

有什么提示吗?谢谢

更新:我知道有一个名为“sublist”的函数,但我需要弄清楚如何自己编写该函数。

终于找到答案了:

-module(list).
-export([take/2]).

take(List,N) -> take(List,N,[]).
take([],_,[]) -> [];
take([],_,List) -> List;
take([H|T], N, List) when N > 0 -> take(T, N-1, lists:append(List,[H]));
take([H|T], N, List) when N == 0 -> List.

【问题讨论】:

    标签: list erlang


    【解决方案1】:

    在 Erlang 中,take 拼写为 lists:sublist

    L = [1, 2, 3, 4];
    lists:sublist(L, 3).   % -> [1, 2, 3]
    

    【讨论】:

      【解决方案2】:

      一个简单的解决方案是:

      take([H|T], N) when N > 0 ->
          [H|take(T, N-1)];
      take(_, 0) -> [].
      

      如果列表中没有足够的元素,这将产生错误。

      当您使用累加器时,通常不会将元素附加到它的末尾,因为这非常低效(每次都复制整个列表)。您通常会使用[H|List] 将元素推送到它上面。然后它将以相反的顺序排列,但您随后会执行 lists:reverse(List) 以按正确的顺序返回它们。

      take(List, N) -> take(List, N, []).
      
      take([H|T], N, Acc) when N > 0 ->
          take(T, N-1, [H|Acc]);
      take(_, 0, Acc) -> lists:reverse(Acc).
      

      累加器版本是尾递归,这是一件好事,但您需要做一个额外的反向操作,这会消除一些好处。我认为第一个版本更清晰。两者都没有明确的案例。

      【讨论】:

        猜你喜欢
        • 2013-01-16
        • 2012-10-10
        • 2021-07-07
        • 2018-04-10
        • 1970-01-01
        • 2011-09-02
        • 2015-12-16
        • 2012-06-13
        • 2014-11-09
        相关资源
        最近更新 更多