首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Erlang中的列表创建

Erlang中的列表创建
EN

Stack Overflow用户
提问于 2010-11-20 15:49:54
回答 4查看 5.5K关注 0票数 6

摘自切萨里尼的"Erlang Programming“练习3-2

当我通过"Erlang编程“时,我得到了奇怪的列表创建问题。在练习3-2中,我写了两个类似的函数。

代码语言:javascript
运行
复制
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?谢谢你的解释。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-20 16:29:32

reverse_create返回一个列表,您使用该列表作为头元素来创建列表,这将导致嵌套列表。尝试此解决方案:

代码语言:javascript
运行
复制
reverse_create( 0 ) -> [];
reverse_create( N ) when N > 0 -> reverse_create( N-1 ) ++ [N].

编辑:一个更好的实现是:

代码语言:javascript
运行
复制
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]).
票数 5
EN

Stack Overflow用户

发布于 2010-11-21 12:44:06

通常,像reverse_create这样的函数是用累加器以尾递归方式完成的。

代码语言:javascript
运行
复制
reverse_create(N) ->
    reverse_create(N, []).

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

Stack Overflow用户

发布于 2010-11-20 17:37:08

当然,您总是可以这样做:

代码语言:javascript
运行
复制
reverse_create(N) -> lists:reverse(create(N)).

这实际上会运行得更快。但这显然不是练习的目的。:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4231760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档