learn you some erlang-recursion

erlang这门语言是没有for循环的,最初一开始我一直也都是使用lists:foldl()来代替for循环来使用的,很少去有意识的使用递归,然后后面有个案子因为要进行模拟操作,所以也只能用递归来解决,后面就开始有意识的开始使用递归操作。
比如要写一个计算lists的长度的一个函数,C/C++大概会按照这样的思路来写

len([]) -> 0;
len([_|T]) -> 1 + len(T).

如果递归层数过多会爆栈,但在erlang里面,可以使用尾递归,erlang在调用函数的时候,看到时尾递归的话就会进行优化,不用保存栈帧的信息

tali_len(L) -> tail_len(L, 0).
tail_len([], Acc) -> Acc;
tail_len([_ | T], Acc) -> tail_len(T,Acc+1).

还有更特殊的,如果函数的最后一个表达式是另一个表达式的调用时,也会进行优化,就是说a()->b().b()->c().c()->a().这种代码也不会栈溢出。

然后在说下之前那个案子,有多个基础物品和高级物品,基础物品不消耗进行生产,高级物品消耗基础物品或者高级物品进行生产,点了天赋会改变生产效率,每个物品有个开关,开关为开时,就算消耗的物品不够,会挂起等待,当消耗的物品产生后变充足时,会自动继续生产,开关为关时不进行生产。
这个的话是对每个资源起了个定时器,当一个资源完成时,就递归检查资源是否能够开启。然后主要是要处理服务器停服期间,资源的计算,这个就是写的一个模拟操作,模拟服务器在线时资源的增长,这个一开始本来想看能不能直接用公式来搞定,自己想了想没什么办法,就这样做吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值