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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...