文章目录

  • 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)