14.1 基本介紹 -Scala飾運行在Java虛擬機(Java Virtual Machine)之上,因此具有如下特點 1) 輕鬆實現和豐富的Java類庫互聯互通 2) 它既支持面向對象的編程方式,又支持函數式編程 3) 它寫出的程式像動態語言一樣簡潔,但事實上它確是嚴格意義上的靜態語言 14.2 ...
14.1 基本介紹
-Scala飾運行在Java虛擬機(Java Virtual Machine)之上,因此具有如下特點
1) 輕鬆實現和豐富的Java類庫互聯互通
2) 它既支持面向對象的編程方式,又支持函數式編程
3) 它寫出的程式像動態語言一樣簡潔,但事實上它確是嚴格意義上的靜態語言
14.2 Scala提倡函數式編程(遞歸思想)
-先說下編程範式:
1) 在所有的編程範式中,面向對象編程(Object-Oriented Programming)無意是最大贏家
2) 但其實面向對象編程並不是一種嚴格意義上的編程範式,嚴格意義上的編程範式分為:命令式編程(Imperative Programming)、函數式編程(Functional Programming)和邏輯式編程(Logic Programming)。面向對象編程只是上述幾種範式的一個交叉產物,更多的還是繼承了命令式編程的基因
3) 在傳統的語言設計中,只有命令式編程得到了強調,那就是程式員要告訴電腦應該怎麼做。而遞歸則是通過靈巧的函數定義,告訴電腦做什麼。因此在使用命令式編程思維的程式中,是現在多數程式採用的編程方式,遞歸出鏡的幾率很少,而在函數式編程中,可以隨處見到遞歸的方式
14.3 應用案例1
-Scala中迴圈不建議使用while和do...while,而建議使用遞歸
14.3.1 案例要求
-計算1-100的和
14.3.2 常規的解決方式
import java.text.SimpleDateFormat import java.util.Date object boke_demo01 { def main(args: Array[String]): Unit = { //傳統方法完成 1-100 的求和任務 val now: Date = new Date() val dateFormat: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") val date = dateFormat.format(now) println("date=" + date) //輸出時間 var res = BigInt(0) var num = BigInt(1) var maxVal = BigInt(100l) //BigInt(99999999l)[測試效率大數] while (num <= maxVal) { res += num num += 1 } println("res=" + res) //再一次輸出時間 val now2: Date = new Date() val date2 = dateFormat.format(now2) println("date2=" + date2) //輸出時間 } }
14.3.3 使用函數式編程方式-遞歸
函數式編程的重要思想就是儘量不要產生額外的影響,上面的案例代碼就不符合函數式編程的思想,下麵使用函數式編程方式來解決(Scala提倡的方式)
-案例演示
import java.text.SimpleDateFormat import java.util.Date object boke_demo01 { def main(args: Array[String]): Unit = { // 遞歸的方式來解決 //傳統方法完成 1-100 的求和任務 val now: Date = new Date() val dateFormat: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") val date = dateFormat.format(now) println("date=" + date) //輸出時間 def mx(num: BigInt, sum: BigInt): BigInt = { if (num <= 100l) return mx(num + 1, sum + num) else return sum } //測試 var num = BigInt(1) var sum = BigInt(0) var res = mx(num, sum) println("res=" + res) //再一次輸出時間 val now2: Date = new Date() val date2 = dateFormat.format(now2) println("date2=" + date2) //輸出時間 } }
14.4 應用案例2
-求最大值
def max(xs: List[Int]): Int = { if (xs.isEmpty) throw new java.util.NoSuchElementException if (xs.size == 1) xs.head else if (xs.head > max(xs.tail)) xs.head else max(xs.tail) }
14.5 使用函數式編程方式-字元串翻轉
def reverse(xs: String): String = if (xs.length == 1) xs else reverse(xs.tail) + xs.head
14.6 使用遞歸-求階乘
def factorial(n: Int): Int = if (n == 0) 1 else n * factorial(n - 1)