Scala学习(四)

文章目录

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

Scala学习(四)_第1张图片

2.函数式编程递归和尾递归

2.1递归

嵌套调用自身的函数
必须要有停止的条件
递归调用的参数必须有规律
结果值的类型不能省略

    //使用递归实现阶乘
    def func_count(n:Int):Long={
      if(n==1)
        {
          1L
        }
        else
        {
          func_count(n-1)*n
        }
    }

    println(func_count(6))

Scala学习(四)_第2张图片

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)

Scala学习(四)_第3张图片

3.控制抽象

控制抽象分为值调用和名调用

3.1 值调用

值调用就是将代码块的结果作为参数传入到函数当中

    //控制抽象
    def sayHi(name:String)={
      println("函数调用")
      println(s"hi $name")
      println(s"hi $name")
    }

    sayHi({
      println("我是代码块")
      "mao"
    })

Scala学习(四)_第4张图片

3.2 名调用

名调用不是将代码块的结果作为参数传入函数中,直接将整个代码块传入到参数中,使用一次代码块就会运行一次。

    def sayHi(name: =>String)={
      println("函数调用")
      println(s"hi $name")
      println(s"hi $name")
    }

    sayHi({
      println("我是代码块")
      "mao"
    })

Scala学习(四)_第5张图片

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)

Scala学习(四)_第6张图片

你可能感兴趣的:(scala,scala,学习,开发语言)