【发布时间】:2012-05-22 22:24:36
【问题描述】:
我有以下函数,它接受一个像 5 这样的数字并创建一个从 1 到该数字的所有数字的列表,所以 create(5)。返回 [1,2,3,4,5]。
我认为我已经过度使用了警卫,并且想知道是否有更好的方法来编写以下内容:
create(N) ->
create(1, N).
create(N,M) when N =:= M ->
[N];
create(N,M) when N < M ->
[N] ++ create(N + 1, M).
【问题讨论】:
-
你可以看看lists:seq的源码,看看它是如何实现的。
-
一般来说,守卫是相当有效的。尝试对不同版本进行基准测试:trapexit.org/Measuring_Function_Execution_Time 有时,具有更多保护的版本会更快,因为编译器使用您提供的额外信息进行了优化。
标签: erlang