柚子快報(bào)激活碼778899分享:開發(fā)語言 Scala學(xué)習(xí)(四)
柚子快報(bào)激活碼778899分享:開發(fā)語言 Scala學(xué)習(xí)(四)
文章目錄
1.閉包2.函數(shù)式編程遞歸和尾遞歸2.1遞歸2.2 尾遞歸
3.控制抽象3.1 值調(diào)用3.2 名調(diào)用
4.惰性函數(shù)
1.閉包
如果一個(gè)函數(shù),訪問到了它的外部(局部)變量的值,那么這個(gè)函數(shù)和它所處的環(huán)境稱之為閉包
//閉包練習(xí)
def sumX(x:Int)={
def sumY(y:Int):Int={
x+y
}
sumY _
}
val xResult = sumX(5)
val result = xResult(6)
println(result)
2.函數(shù)式編程遞歸和尾遞歸
2.1遞歸
嵌套調(diào)用自身的函數(shù) 必須要有停止的條件 遞歸調(diào)用的參數(shù)必須有規(guī)律 結(jié)果值的類型不能省略
//使用遞歸實(shí)現(xiàn)階乘
def func_count(n:Int):Long={
if(n==1)
{
1L
}
else
{
func_count(n-1)*n
}
}
println(func_count(6))
2.2 尾遞歸
尾遞歸,顧名思義,即最后遞歸調(diào)用函數(shù)的一行,只有自身的函數(shù)沒有其他的值。
//使用尾遞歸對(duì)階乘進(jìn)行優(yōu)化
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.控制抽象
控制抽象分為值調(diào)用和名調(diào)用
3.1 值調(diào)用
值調(diào)用就是將代碼塊的結(jié)果作為參數(shù)傳入到函數(shù)當(dāng)中
//控制抽象
def sayHi(name:String)={
println("函數(shù)調(diào)用")
println(s"hi $name")
println(s"hi $name")
}
sayHi({
println("我是代碼塊")
"mao"
})
3.2 名調(diào)用
名調(diào)用不是將代碼塊的結(jié)果作為參數(shù)傳入函數(shù)中,直接將整個(gè)代碼塊傳入到參數(shù)中,使用一次代碼塊就會(huì)運(yùn)行一次。
def sayHi(name: =>String)={
println("函數(shù)調(diào)用")
println(s"hi $name")
println(s"hi $name")
}
sayHi({
println("我是代碼塊")
"mao"
})
4.惰性函數(shù)
惰性函數(shù),當(dāng)函數(shù)的返回值被聲明為lazy的時(shí)候,函數(shù)的執(zhí)行將被推遲到我們首次對(duì)此取值,該函數(shù)才會(huì)執(zhí)行,這種函數(shù)我們稱為惰性函數(shù) 案例實(shí)操:
//正常函數(shù)執(zhí)行
//實(shí)現(xiàn)懶加載
def sumXY(x: Int, y: Int): Int = {
println("sum函數(shù)調(diào)用")
x + y
}
val sum: Int = sumXY(5, 6)
println("其他代碼")
println(sum)
運(yùn)行結(jié)果: 使用惰性函數(shù)運(yùn)行上述代碼,不會(huì)在調(diào)用函數(shù)的時(shí)候就執(zhí)行,而是等到調(diào)用返回值的時(shí)候再進(jìn)行計(jì)算
lazy val sum: Int = sumXY(5,6)
println("其他代碼")
println(sum)
柚子快報(bào)激活碼778899分享:開發(fā)語言 Scala學(xué)習(xí)(四)
相關(guān)鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。