-
尾遞歸函數
尾遞歸函數(Tail Recursive Function)中所有遞歸形式的調用都出現在函數的未尾。
當編譯器檢測到一個函數調用是尾遞歸的時候,它就覆蓋當前的活動記錄而不是在棧中去創建一個新的。查看全部 -
注意尾遞歸函數的寫法,loop 函數定義了兩個參數表示區間變量和累加和,這是關鍵。另外,f(x)函數用匿名推導來定義,靈活的推廣到二階和三階求和。查看全部
-
# 函數式編程
> 命令式編程在理論上上升到語言學的層次,不可判定的問題很多,且為了實用引人更多的模糊地帶,是不夠嚴密的。而函數式編程關心語義,從數理邏輯出發建立基礎,例如三大語義,泛代數,可靠性完備性,合流,規約等概念,體系上更嚴密。而且視公理化為頭等大事。 - https://www.zhihu.com/question/36782552
- 函數式編程是一種編程范式
## 范式(Paradigm)
- 范式包括 philosophy (理念) 和 methods (方法)兩部分
? ? 1. 某事的 philosophy (理念) 就是,做某事,什么該做,什么不該做,以及方式
? ? 2. Methods (方法)就是繼方式之后的具體的操作
## 函數式編程沒有副作用
> 副作用指的是函數內部與外部互動(最典型的情況,就是修改全局變量的值),產生運算以外的其他結果。函數式編程強調沒有"副作用",意味著函數要保持獨立,所有功能就是返回一個新的值,沒有其他行為,尤其是不得修改外部變量的值。
```scala
var x=1
def XPlusY_v1(y: Int)=x+y
def XPlusY_v2(y: Int)={x+y;x} //有副作用,改變了x的值
```
## 函數式編程引用透明
- 對于相同的輸入,總是得到相同的輸出
- 如果f(x)的參數x和函數體都是透明的,那么函數f(x)是純函數
```scala
var x = new StringBulider("Hello")
var y = x.append(" World!") //Hello World!
var z = x.append(" World!") //Hello World! World!
// appned 方法違反了引用透明性
```
### 不變性 Immutability
- 為了獲得引用透明性,任何值都不能變
## 表達式求值
1. 嚴格求值 call by value
2. 非嚴格求值 call by name
查看全部 -
try catch finally 跟Java差不多 只不過catch這里是個表達式
code match 類似switch
查看全部 -
if條件判斷 沒有設置值默認{}
for循環 s <- l? 賦值? yield配合變量將新的值打印出來
查看全部 -
Scala的函數可以足夠聰明知道函數的返回值類型 Scala的函數簡單的一行表達式不需要函數括號
查看全部 -
底精度變量可以直接向高精度變量轉換
Unit 表示無值,和其他語言中void等同,用作不返回任何結果的方法的結果類型。Unit只有一個實例值,寫成()。
Nothing Nothing類型在Scala的類層級的最低端;它是任何其他類型的子類型。函數出錯會返回Nothing。
函數定義
def?main(args:?Array[String]):?Unit?=?{}
字符串占位符:
var?e?=?"bob"; println(s"your?name?is?${e}")
查看全部 -
三種變量修飾符 val?定義常量,不可修改 var?定義變量 lazy?val?只要第一次使用到時候,才會運算表達式得到值 可以不顯示指定變量的類型,因為Scala會自動進行類型推導
查看全部 -
Scala里有兩種求值策略(Evaluation?Strategy) Call?By?Value?-?對函數實參求值,且僅求值一次 Call?By?Name?-?函數實參每次在函數體內被用到時都會求值
查看全部 -
try 在Scala里面不是一個語句,而是一個表達式
查看全部 -
Scala的for循環和Java的有很大差異,但基本原理是一致的。
查看全部 -
1.?在Scala?IDE中有一個很便捷的功能,那就是WorkSheet 它類似于交互式命令行的代碼測試,在Worksheet輸入scala表達式,保存以后會立即得到程序運行的結果 2.?Scala的函數可以足夠聰明知道函數的返回值類型 3.?Scala的函數簡單的一行表達式不需要函數括號
查看全部 -
底精度變量可以直接向高精度變量轉換
Unit 表示無值,和其他語言中void等同,用作不返回任何結果的方法的結果類型。Unit只有一個實例值,寫成()。
Nothing Nothing類型在Scala的類層級的最低端;它是任何其他類型的子類型。函數出錯會返回Nothing。
查看全部 -
三種變量修飾符 val?定義常量,不可修改 var?定義變量 lazy?val?只要第一次使用到時候,才會運算表達式得到值 可以不顯示指定變量的類型,因為Scala會自動進行類型推導
查看全部 -
Install?Java?JDK Download?Scala Install?SBT REPL?(Read?Evaluate?Print?Loop) Install?Scala?IDE
查看全部
舉報