Scala函数式编程
函数式编程基础
- 函数定义/声明
- 函数运行机制
- 递归//难点 [最短路径,邮差问题,迷宫问题, 回溯]
- 过程
- 惰性函数和异常
函数式编程高级
- 值函数(函数字面量)
- 高阶函数
- 闭包
- 应用函数
- 柯里化函数,抽象控制…
在scala中,函数式编程和面向对象编程融合在一起,学习函数式编程式需要oop的知识,同样学习oop需要函数式编程的基础。[矛盾] 关系如下图:
在学习Scala中将方法、函数、函数式编程和面向对象编程明确一下:
- 在scala中,方法和函数几乎可以等同(比如他们的定义、使用、运行机制都一样的),只是函数的使用方式更加的灵活多样。
- 函数式编程是从编程方式(范式)的角度来谈的,可以这样理解:函数式编程把函数当做一等公民,充分利用函数、 支持的函数的多种使用方式。比如:在Scala当中,函数是一等公民,像变量一样,既可以作为函数的参数使用,也可以将函数赋值给一个变量. ,函数的创建不用依赖于类或者对象,而在Java当中,函数的创建则要依赖于类、抽象类或者接口.
- 面向对象编程是以对象为基础的编程方式。
- 在scala中函数式编程和面向对象编程融合在一起了 。
在学习Scala中将方法、函数、函数式编程和面向对象编程关系分析图:
函数式编程介绍
- “函数式编程"是一种"编程范式”(programming paradigm)。
- 它属于"结构化编程"的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。
- 函数式编程中,将函数也当做数据类型,因此可以接受函数当作输入(参数)和输出(返回值)。
- 函数式编程中,最重要的就是函数。
函数的定义
基本语法
代码语言:javascript复制def 函数名 ([参数名: 参数类型], ...)[[: 返回值类型] =] {
语句...
return 返回值
}
- 函数声明关键字为def (definition)
- [参数名: 参数类型], …:表示函数的输入(就是参数列表), 可以没有。 如果有,多个参数使用逗号间隔
- 函数中的语句:表示为了实现某一功能代码块
- 函数可以有返回值,也可以没有
- 返回值形式1: : 返回值类型 =
- 返回值形式2: = 表示返回值类型不确定,使用类型推导完成
- 返回值形式3: 表示没有返回值,return 不生效
- 如果没有return ,默认以执行到最后一行的结果作为返回值
函数-调用机制
为了让大家更好的理解函数调用机制, 看1个案例,并画出示意图,这个很重要,比如getSum 计算两个数的和,并返回结果。
代码语言:javascript复制object Test01 {
def main(args: Array[String]): Unit = {
val n1 = 1
val n2 = 3
val res = sum(n1, n2)
println("res=" res)
}
def sum(n1: Int, n2: Int): Int = {
return n1 n2
}
}
函数-递归调用
基本介绍
一个函数在函数体内又调用了本身,我们称为递归调用
代码语言:javascript复制def test (n: Int) {
if (n > 2) {
test (n - 1)
}
println("n=" n) //
}
代码语言:javascript复制def test2 (n: Int) {
if (n > 2) {
test2 (n - 1)
}else {
println("n=" n)
}
}
函数递归需要遵守的重要原则(总结):
- 程序执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
- 函数的局部变量是独立的,不会相互影响
- 递归必须向退出递归的条件逼近,否则就是无限递归,死龟了:)
- 当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁。