文章目录
- 1.闭包
- 2.函数式编程递归和尾递归
- 2.1递归
- 2.2 尾递归
- 3.控制抽象
- 3.1 值调用
- 3.2 名调用
- 4.惰性函数
1.闭包
如果一个函数,访问到了它的外部(局部)变量的值,那么这个函数和它所处的环境称之为闭包
//闭包练习def sumX(x:Int)={def sumY(y:Int):Int={x+y}sumY _}val xResult = sumX(5)val result = xResult(6)println(result)
2.函数式编程递归和尾递归
2.1递归
嵌套调用自身的函数
必须要有停止的条件
递归调用的参数必须有规律
结果值的类型不能省略
//使用递归实现阶乘def func_count(n:Int):Long={if(n==1){1L}else{func_count(n-1)*n}}println(func_count(6))
2.2 尾递归
尾递归,顾名思义,即最后递归调用函数的一行,只有自身的函数没有其他的值。
//使用尾递归对阶乘进行优化def lastRecursion(n:Int,res:Long=1):Long={if(n==1){res}else{lastRecursion(n-1,res*n)}}val result = lastRecursion(5)println(result)
3.控制抽象
控制抽象分为值调用和名调用
3.1 值调用
值调用就是将代码块的结果作为参数传入到函数当中
//控制抽象def sayHi(name:String)={println("函数调用")println(s"hi $name")println(s"hi $name")}sayHi({println("我是代码块")"mao"})
3.2 名调用
名调用不是将代码块的结果作为参数传入函数中,直接将整个代码块传入到参数中,使用一次代码块就会运行一次。
def sayHi(name: =>String)={println("函数调用")println(s"hi $name")println(s"hi $name")}sayHi({println("我是代码块")"mao"})
4.惰性函数
惰性函数,当函数的返回值被声明为lazy的时候,函数的执行将被推迟到我们首次对此取值,该函数才会执行,这种函数我们称为惰性函数
案例实操:
//正常函数执行//实现懒加载def sumXY(x: Int, y: Int): Int = {println("sum函数调用")x + y}val sum: Int = sumXY(5, 6)println("其他代码")println(sum)
运行结果:
使用惰性函数运行上述代码,不会在调用函数的时候就执行,而是等到调用返回值的时候再进行计算
lazy val sum: Int = sumXY(5,6)println("其他代码")println(sum)