摘自切萨里尼的"Erlang Programming“练习3-2
当我通过"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)会像我预期的那样生成。
练习3:创建(3)。
3,2,1
但是reverse_create没有生成我期望的列表。
exercise3:reverse_create(3)。
[]|1]|2]|3]
我需要做什么更改才能使reverse_create(3)返回1,2,3?谢谢你的解释。
发布于 2010-11-20 16:29:32
reverse_create
返回一个列表,您使用该列表作为头元素来创建列表,这将导致嵌套列表。尝试此解决方案:
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]).
发布于 2010-11-21 12:44:06
通常,像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]).
发布于 2010-11-20 17:37:08
当然,您总是可以这样做:
reverse_create(N) -> lists:reverse(create(N)).
这实际上会运行得更快。但这显然不是练习的目的。:)
https://stackoverflow.com/questions/4231760
复制相似问题