来自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]?谢谢你解释。
答案 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.