以一道编程题为例:
要求:编写一个列表反转程序,但不使用lists:reverse.
[1,2,3,...,5] ->[5,...,3,2,1]
示例1:
通过模式匹配,一个函数名实现。
注意:这里其实是两个函数(参数个数不同的两个同名函数)。
优点:代码简洁
缺点:可读性不高。明明是两个函数,却取了同一个名字,感觉怪怪的。
示例2:
分层设计,将入口调用函数(my_reverse/1)和处理过程函数(middle_reverse/2)分开.
处理过程使用一个函数调用过程,内部通过if来进行判断进入不同的分支。
优点:代码分层,可读性强。
缺点:处理过程函数使用if,没有充分利用好erlang模式匹配的天性,而且那个true让人感觉怪怪的。
要求:编写一个列表反转程序,但不使用lists:reverse.
[1,2,3,...,5] ->[5,...,3,2,1]
示例1:
通过模式匹配,一个函数名实现。
注意:这里其实是两个函数(参数个数不同的两个同名函数)。
优点:代码简洁
缺点:可读性不高。明明是两个函数,却取了同一个名字,感觉怪怪的。
-module(test).
-export([my_reverse/1]).
my_reverse(L) -> my_reverse(L, []).
my_reverse([H|T], Result) -> my_reverse(T, [H|Result]);
my_reverse([], Result) -> Result.
示例2:
分层设计,将入口调用函数(my_reverse/1)和处理过程函数(middle_reverse/2)分开.
处理过程使用一个函数调用过程,内部通过if来进行判断进入不同的分支。
优点:代码分层,可读性强。
缺点:处理过程函数使用if,没有充分利用好erlang模式匹配的天性,而且那个true让人感觉怪怪的。
-module(test).
-export([my_reverse/1]).
my_reverse([]) -> [];
my_reverse(L) -> middle_reverse(L, []).
middle_reverse([H|T], Res