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

来源:https://www.cnblogs.com/zhanghuicheng/archive/2019/05/22/10884459.html
-Advertisement-
Play Games

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)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 學習技術的過程總是需要慢慢積累的,所以持續學習是一個一直存在的事情。很高興,我能一直通過看書輸出設計模式相關的系列,也很感謝各位朋友的持續關註。 廢話不多說啦,今天我們繼續學習一個對於Android開發來說可能不太陌生的模式,適配器模式和外觀模式。曾經或者現在正在做Android開發的你,是不是很熟 ...
  • 所屬網站分類: python基礎 > 語法,變數,運算符 作者:goodbody 鏈接: http://www.pythonheidong.com/blog/article/12/ 來源:python黑洞網 www.pythonheidong.com 很多人以為Python是沒有三元運算符的,但實際 ...
  • 1,重載是 C 語言到 C++ 語言的一個飛躍,C 語言中沒有重載的概念,所有的函數 名是不允許有重覆的,在 C++ 中因為引進了重載,所以函數名可以重覆; 2,自然語言中的上下文: 1,你知道上面辭彙中“洗”字的含義嗎? 1,不同的動詞和名次搭配的含義是不同的; 2,結論: 1,能和“洗”字搭配的 ...
  • 工作之餘在知乎上偶然看到一篇回帖,瞬間覺得之前看的那麼多資料都不及這一篇讓我對 websocket 的認知深刻易懂,之前看總完總覺得一知半解雲里霧裡。所以與大家共同分享一下一起學習。比較喜歡這種博客理論和小故事的事例結合,讀起來很輕鬆,不枯燥。廢話不多說了,進入正題了~ 一、websocket與ht ...
  • 發佈與訂閱消息系統 在正式討論Apache Kafka (以下簡稱Kafka)之前,先來瞭解發佈與訂閱消息系統的概念, 並認識這個系統的重要性。數據(消息)的發送者(發佈者)不會直接把消息發送給接收 者,這是發佈與訂閱消息系統的一個特點。發佈者以某種方式對消息進行分類,接收者 (訂閱者)訂閱它們,以 ...
  • [toc] 這篇文章主要講 map 的賦值、刪除、查詢、擴容的具體執行過程,仍然是從底層的角度展開。結合源碼,看完本文一定會徹底明白 map 底層原理。 我要說明的是,這裡對 map 的基本用法涉及比較少,我相信可以通過閱讀其他入門書籍瞭解。本文的內容比較深入,但是由於我畫了各種圖,我相信很容易看懂 ...
  • JVM記憶體分為哪幾部分?各個部分的作用是什麼? JVM記憶體分為哪幾部分?各個部分的作用是什麼? JVM記憶體分為哪幾部分?各個部分的作用是什麼? JVM記憶體分為哪幾部分?各個部分的作用是什麼? 1. Java虛擬機記憶體的五大區域 Java的運行離不開Java虛擬機的支持,今天我就跟大家探討一下Java ...
  • 厲害了,2019/05/21 Apache軟體基金會發表博文,宣佈 Dubbo 在 2019/05/20 這天正式畢業,成為 Apache 的頂級項目。 參考:https://blogs.apache.org/foundation/entry/the apache software foundati ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...