erlang递归和尾递归

非尾递归

sum_1(0) -> 

0;
sum_1(N) ->

sum_1(N-1) + N.

尾递归

sum_2(N) ->
sum_2(N,0).
sum_2(0,Sum) -> 
Sum;
sum_2(N,Sum) ->

sum_2(N-1,Sum + N).

递归:不断调用自身函数,直到遇见结束条件。

非尾递归的流程:以sum_1(N)为例,在N不等于0之前,调用sum_1(N-1),栈需要记录这个点,以便返回计算结果后加上N。

尾递归的流程:以sum_2(N)为例,在N不等于0之前,调用sum_1(N-1,Sum+N),栈只需要记录Sum。

尾递归优势:如果N足够大,可能造成栈溢出,但是两种递归各有优势,当Sum的数据很复杂,尾递归效率就会受到限制,总之具体情况,选择合适的递归。

如何区别:个人的方法是,看函数的返回,如果只有一个值,直接返回,则是尾递归,反之为非尾递归。


另外:

length(List)会遍历整个列表,

不建议用在

loop(List)  when length(List) > 0 ->

todo;

loop(List) ->

todo.

时间消耗和List长度成正比,尽量使用 [ ] 匹配区别。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值