Scala函数--函数式练习及柯里化函数的概念
题目一: 用一个for写出一个三角形图案
def main(args: Array[String]): Unit = {
for ( i <- 1 to 18 by 2 ; j = (18 - i)/2){
println(" "*j + "*" *i)
}
}
题目二:逆推 f(10)(20)() 公式 结果为200
第一种写法
def f5(x:Int)(y:Int)(f:(Int,Int)=>Int):Int={
f(x ,y)
}
f5(10)(20)(_*_)
第二种写法
def f4(x: Int, y: Int, f: (Int, Int) => Int) = {
f(x, y)
}
println(f4(10, 20, _ * _))
第三种写法
def f1(x:Int)={
def f2(y:Int)={
def f3(f:(Int,Int)=>Int):Int={
f(x,y)
}
f3 _
}
f2 _
}
println(f1(600)(20)(_*_))
柯里化函数
举例
def f1(x: Int) = {
def f2(y: Int): Int = {
x + y
}
f2 _
}
println(f1(10)(20))
疑问
为什么f2可以使用x的值?
其实这个问题大家要回答很容易,但真正能回答到原理的估计没几个
首先我们从执行角度来看
f1(10)
x 在 f1 使用完后,就要被弹出栈了,f2是无论如何在取不到 x 的值
f1(10)(20)
所以这里Scala中就有一个闭包的概念
闭包
当一个函数使用了函数之外的变量时,为了防止变量数据失效,改变了变量的生命周期
将这个变量包含到了当前的函数中,形成了一种闭合效果,简称为闭包
柯里化函数
柯里化函数一般都具有闭包效果
def f5(x:Int)(y:Int)(f:(Int,Int)=>Int):Int={
f(x ,y)
}
f5(10)(20)(_*_)
下面这个就不是柯里化函数(不具有闭包效果)
def f4(x: Int, y: Int, f: (Int, Int) => Int) = {
f(x, y)
}
println(f4(10, 20, _ * _))