erlang list:delete不建议使用
成长就是一个不断积累的过程,记录点点游戏项目中的一些吹毛求疵的优化。菜鸟己见,欢迎不认同者,批评指教!!!
首先我们看erlang自带的lists:delete源码
delete(Item,[Item|Rest]) ->Rest;
delete(Item,[H|Rest]) ->
[H|delete(Item,Rest)];
delete(_,[]) ->[].
此段代码首先不是尾递归,不用尾递归的弊处在这里我就不多说了,这个函数有点误导,不看介绍,以为是删除所有符合的元素,其实只是删除第一个符合要求的元素,之所以不用尾递归,而且只删第一个元素,我想有它特定的用处吧,它这种做法,能保证被处理过后的list顺序不会发生变化,而且只删一个。
我个人写了个尾递归的如下(删除所有符合要求元素,得到的列表顺序反了)
delete(Item,List) ->
delete1(Item,List,[]).
delete1(_,[],L)->
L;
delete1(Item,[Temp|List],L) ->
case Item =:= Temp of
true ->
delete1(Item,List,L);
false ->
delete1(Item,List,[Temp|L])
end.
PS:我这种只是为了写成尾递归,它的时间效率和源码中的lists:delete效率差不多 ,缺点顺序反了,我自己写了测试100万元素的情况下,效率差不多,当然高手是不会写这种的,高手一般都用列表解析,它的效率一般是源码lists:delete的两倍以上,[Temp||Temp<-List,Temp=/=Item],如果你是删除列表中所有Item,极力推荐使用前面所说的列表解析方法。
当然如果你的列表长度不长,又不会出现重复的,lists:delete和列表解析差不多,几乎没啥影响,而且如果你确实也只需要删除一个元素,那还是用lists:delete吧。
总而言之,我只是说出了几种不同方式,如何在游戏代码中高效合理应用,还需个人斟酌。
上一篇: 基于vue的换肤功能的示例代码
下一篇: 数组中遍历的方法
推荐阅读
-
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
-
Mysql数据库中的 Order by 语句的特殊之处(select 中的项目不必出现在order by中)---不建议使用!
-
为什么不建议使用Date,而是使用Java8新的时间和日期API?
-
为什么在MySQL中不建议使用UTF-8
-
Oracle数据库学习之表的创建与使用(修改表结构)不建议使用
-
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)_PHP教程
-
erlang list:delete不建议使用
-
为什么不建议在go项目中使用init()
-
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)_php技巧
-
MoviePy v2.0.0.dev1尚不成熟,不建议大家使用