递归
以 f(a) a=1,2,3…n求和为例。
1. 线性递归
def sumFactorials(f:Int=>Int,a:Int,b:Int):Int={
if (a >b) 0
else f(a) + sumFactorials(f,a+1,b)
}
2.尾递归
def sumFacorials(f:Int=>Int,a:Int,b:Int):Int={
def loop(a:Int,acc:Int):Int={
if (a > b) acc
else loop(a+1,acc+f(a))
}
loop(a,0)
}
尾递归每次分配的内存不会因为递归而扩大。是因为尾递归是没递归一次算一次上一步的结果算完就释放了。而线性递归式不断迭代到终点,再回溯回去。
currying
我的理解是函数式编程的思想
// currying
def smFactorials4(f:Int=>Int)(a:Int,b:Int):Int={
def loop(a:Int,acc:Int):Int={
if (a > b) acc
else loop(a+1,f(a)+acc)
}
loop(a,0)
}
mapReduce
def mapReduce(f:Int=>Int,combine:(Int,Int)=>Int,zero:Int)(a:Int,b:Int):Int={
if (a > b) zero
else combine(f(a),mapReduce(f,combine,zero)(a+1,b))
}
def product(f:Int=>Int)(a:Int,b:Int):Int=mapReduce(f,(x,y)=>x*y,1)(a,b)
2a*2b