14. Scala使用遞歸的方式去思考,去編程

14.1 基本介紹

      -Scala飾運行在Java虛擬機(Java Virtual Machine)之上,所以具備以下特色java

        1) 輕鬆實現和豐富的Java類庫互聯互通程序員

        2) 它既支持面向對象的編程方式,又支持函數式編程編程

        3) 它寫出的程序像動態語言同樣簡潔,但事實上它確是嚴格意義上的靜態語言函數式編程

14.2 Scala提倡函數式編程(遞歸思想) 

      -先說下編程範式:函數

        1) 在全部的編程範式中,面向對象編程(Object-Oriented Programming)無心是最大贏家測試

        2) 但其實面向對象編程並非一種嚴格意義上的編程範式,嚴格意義上的編程範式分爲:命令式編程(Imperative Programming)、函數式編程(Functional Programming)和邏輯式編程(Logic Programming)。面向對象編程只是上述幾種範式的一個交叉產物,更多的仍是繼承了命令式編程的基因scala

        3) 在傳統的語言設計中,只有命令式編程獲得了強調,那就是程序員要告訴計算機應該怎麼作。而遞歸則是經過靈巧的函數定義,告訴計算機作什麼。所以在使用命令式編程思惟的程序中,是如今多數程序採用的編程方式,遞歸出鏡的概率不多,而在函數式編程中,能夠隨處見到遞歸的方式設計

14.3 應用案例1 

      -Scala中循環不建議使用while和do...while,而建議使用遞歸orm

  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)
相關文章
相關標籤/搜索