本文主要是介绍scala中的递归和currying,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
递归
以 f(a) a=1,2,3…n求和为例。
1. 线性递归
def sumFactorials(f:Int=>Int,a:Int,b:Int):Int={if (a >b) 0else 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) accelse loop(a+1,acc+f(a))}loop(a,0)}
尾递归每次分配的内存不会因为递归而扩大。是因为尾递归是没递归一次算一次上一步的结果算完就释放了。而线性递归式不断迭代到终点,再回溯回去。
尾递归地讲解
currying
我的理解是函数式编程的思想
// curryingdef smFactorials4(f:Int=>Int)(a:Int,b:Int):Int={def loop(a:Int,acc:Int):Int={if (a > b) accelse 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) zeroelse 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
这篇关于scala中的递归和currying的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!