一、递归
例子:给函数bump/1中的每一个元素+1.
方法:
二、 尾递归函数
例子:计算一个元组里面所有元素之和。
递归函数:
尾递归函数:
这种定义的方法是使用一个额外的函数参数,成为累加参数,在计算时用它来保存总和。如果函数称为sum_acc,第二个参数保存“到目前为止的总和”。
7 | sum_acc([ Head | Tail ], Sum )->sum_acc( Tail , Head + Sum ). |
例子:给元组里面每一个元素+1
03 | - export ([bump/2,bump_acc/1]). |
11 | bump([ Head | Tail ], Acc ) -> |
12 | bump( Tail ,[ Head +1| Acc ]). |
三、尾调用递归优化
之前在使用尾递归函数的时候,只要函数f的调用发生在函数体的最后一个表达式(即尾部),这个函数f就是尾递归。
累加器:
例子:求一个元组的平均值
1 | average( List )->average_acc( List ,0,0). |
3 | average_acc([], Sum , Length )-> Sum / Length ; |
5 | average_acc([ Head | Tail ], Sum , Length )->average_acc( Tail , Sum + Head , Length +1); |
这个average_acc的代码速度更快,使用空间更少!