在Erlang中创建列表

时间:2010-11-20 07:49:54

标签: list erlang reverse

来自Cesarini练习3-2的“Erlang编程”

当我通过“Erlang编程”时,我得到了奇怪的列表创建问题。从练习3-2开始,我写了两个相似的函数。

create( 0 ) -> [];
create( N ) when N > 0 -> [ N | create( N-1 ) ].

reverse_create( 0 ) -> [];
reverse_create( N ) when N > 0 -> [ reverse_create( N-1 ) | N ].

所以create(3)会按照我的预期生成。

exercise3:创建(3)。
[3,2,1]

但是reverse_create不会生成我期望的列表。

exercise3:reverse_create(3)
。 [[[[] | 1] | 2] | 3]

我需要更改什么才能使reverse_create(3)返回[1,2,3]?谢谢你解释。

5 个答案:

答案 0 :(得分:5)

reverse_create返回一个列表,并使用它作为head元素来创建导致嵌套列表的列表。试试这个解决方案:

reverse_create( 0 ) -> [];
reverse_create( N ) when N > 0 -> reverse_create( N-1 ) ++ [N].

编辑:更好的实施方式是:

reverse_create2(N) -> reverse_create_helper(N, []).

reverse_create_helper(0, Acc) ->
    Acc;
reverse_create_helper(N, Acc) ->
    reverse_create_helper(N-1, [N|Acc]).

答案 1 :(得分:3)

通常情况下,诸如reverse_create之类的函数将使用累加器以尾递归方式完成。

reverse_create(N) ->
    reverse_create(N, []).

reverse_create(0, Acc) ->
    Acc;
reverse_create(N, Acc) when N > 0 ->
    reverse_create(N - 1, [N | Acc]).

答案 2 :(得分:2)

当然,你总能做到:

reverse_create(N) -> lists:reverse(create(N)).

这实际上会跑得更快。但这显然不是演习的目的。 :)

答案 3 :(得分:1)

我正在读同一本书,所以我不比你更专业,但这对我有用......

create(0) -> [];
create(N) when N > 0 -> create(N-1) ++ [N].

reverse_create(0) -> [];
reverse_create(N) when N > 0 -> [N|create(N-1)].

答案 4 :(得分:-1)

这是



    reverse_create(0) -> [];
    reverse_create(N) ->
        list_create_1(1, N, []).

    list_create_1(I, N, List) when N >= I ->
        list_create_1(I + 1, N, [I | List]);
    list_create_1(_, _, List) -> List.