如何在erlang中将字符串列表拆分为给定数量的列表

Ton*_*aik 2 erlang

给定一个列表和一个整数,我想将该列表拆分为指定数量的列表(在列表内)。

例如:

输入:

[1,2,3,4,5,6,7,8,9], 3
Run Code Online (Sandbox Code Playgroud)

输出:

[[1,2,3],[4,5,6],[7,8,9]]
Run Code Online (Sandbox Code Playgroud)

什么是干净有效的方法来做到这一点?

Hyn*_*dil 5

Steve Vinoski编写的解决方案为每个分区调用守卫。这只是让我烦恼,因为它可以完成,而我是性能狂。它可以通过多种方式完成,例如,有一种:length/1O(N^2)O(N)

divide(L, N) when is_integer(N), N > 0 ->
    divide(N, 0, L, []).

divide(_, _, [], Acc) ->
    [lists:reverse(Acc)];
divide(N, N, L, Acc) ->
    [lists:reverse(Acc) | divide(N, 0, L, [])];
divide(N, X, [H|T], Acc) ->
    divide(N, X+1, T, [H|Acc]).
Run Code Online (Sandbox Code Playgroud)

或作为史蒂夫解决方案的修改

divide(L, N) ->
    divide(L, N, []).

divide([], _, Acc) ->
    lists:reverse(Acc);
divide(L, N, Acc) ->
    try lists:split(N, L) of
        {H,T} -> divide(T, N, [H|Acc])
    catch
        error:badarg ->
            lists:reverse([L|Acc])
    end.
Run Code Online (Sandbox Code Playgroud)

甚至更简单:

divide([], _) -> [];
divide(L, N) ->
    try lists:split(N, L) of
        {H,T} -> [H|divide(T, N)]
    catch
        error:badarg -> [L]
    end.
Run Code Online (Sandbox Code Playgroud)