(1) 函式式程式設計:
它屬於」結構化程式設計」的一種,主要思想是把運算過程盡量寫成一系列巢狀的函式呼叫。
函式程式語言最重要的基礎是λ演算(lambda calculus),而且λ演算的函式可以接受函式當作輸入(引數)和輸出(返回值)。【補充:lambda演算是通過乙個函式來解決這個問題,而這個函式又是由一系列別的函式組成,這樣遞迴下去,最終達到常量。有些類似動態規劃那種乙個問題由多個子問題組成,子問題又有自己的子問題,最後到達一些已知解的問題。】
閉包和高階函式、
惰性計算
遞迴①函式是」第一等公民」
指的是函式與其他資料型別一樣,處於平等地位,可以賦值給其他變數,也可以作為引數,傳入另乙個函式,或者作為別的函式的返回值
②只用」表示式」,不用」語句」
③沒有」***」
指的是函式內部與外部互動(最典型的情況,就是修改全域性變數的值),產生運算以外的其他結果。因為 fp 語言不包含任何賦值語句,變數值一旦被指派就永遠不會改變。
④不修改狀態
函式式程式設計只是返回新的值,不修改系統變數。因此,不修改變數,也是它的乙個重要特點
⑤引用透明性
即如果提供同樣的輸入,那麼函式總是返回同樣的結果。就是說,表示式的值不依賴於可以改變值的全域性狀態。
1.優點
**簡潔,開發快速;
接近自然語言,易於理解;
方便的**管理(有利於進行單元測試(unit testing)和除錯(debugging),以及模組化組合)
易於」併發程式設計」
**的熱公升級
2.缺點
函式式程式設計常被認為嚴重耗費在cpu和儲存器資源。
例如: 由於所有的資料都是不可變的,所以所有的變數在程式執行期間都是一直存在的,非常占用執行資源。同時由於函式式的先天性設計導致效能一直不夠。雖然現代的函式式程式語言使用了很多技巧比如惰性計算等來優化執行速度,但是始終無法與物件導向的程式相比,當然物件導向程式的速度也不夠快。
程式語言主要有三種型別[3]:
命令式程式設計(imperative programming): 專注於」如何去做」,這樣不管」做什麼」,都會按照你的命令去做。解決某一問題的具體演算法實現。
函式式程式設計(functional programming):把運算過程盡量寫成一系列巢狀的函式呼叫。
邏輯式程式設計(logical programming):它設定答案須符合的規則來解決問題,而非設定步驟來解決問題。過程是事實+規則=結果。
函式式程式設計
相比於命令式程式設計關心解決問題的步驟,函式式程式設計是面向數學的抽象,關心資料(代數結構)之間的對映關係。函式式程式設計將計算描述為一種表示式求值。
在狹義上,函式式程式設計意味著沒有可變變數,賦值,迴圈和其他的命令式控制結構。即,純函式式程式語言。
在廣義上,函式式程式設計意味著專注於函式
當然在現在很多(非純)函式式程式語言中也有方法和函式的區別。比如scala[1]:
scala> def m(x:int) = 2*x //定義乙個方法
m: (x: int)int
scala> m //方法不能作為最終表示式出現
:9: error: missing arguments for method m;
follow this method with
'_' m
^
scala> val f = (x:int) => 2*x //定義乙個函式
f: int => int = scala> f //函式可以作為最終表示式出現
res9: int => int =
方法就是命令式程式設計中的函式,而函式則是函式式程式設計中的函式。
純函式式程式語言中的變數也不是命令式程式語言中的變數(儲存狀態的記憶體單元),而是數學代數中的變數,即乙個值的名稱。
變數的值是不可變的(immutable),也就是說不允許像命令式程式語言中那樣能夠多次給乙個變數賦值。比如說在命令式程式語言我們寫x = x + 1。
函式式語言中的條件語句,迴圈語句等也不是命令式程式語言中的控制語句,而是一種表示式。
嚴格意義上的函式式程式設計意味著不使用可變的變數,賦值,迴圈和其他命令式控制結構進行程式設計。 當然,很多所謂的函式式程式語言並沒有嚴格遵循這一類的準則,只有某些純函式式程式語言,如haskell等才是完完全全地依照這種準則設計的。
函式式程式設計的特性:
什麼是函式式程式設計
通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 注意多了乙個 式 字 functional programming,雖然也可以歸結到面向過程的程式設計,但其思想更接近數學計算...
什麼是函式式程式設計
定義函式式程式設計其實就是編寫非故意 的程式。課外知識 什麼是函式函式簡單的說就是從a 定義域 到b 值域 的乙個對映過程。當然具體的函式還有各種限制,具體見鏈結。所以函式式程式設計也應該是乙個從入參到返回值的黑盒子。概述並不是所有人在函式式程式設計的定義上達成了共識。一般來說,函式式程式設計是使用...
什麼是函式式程式設計思維?
我為什麼要把我的知乎回答搬到這裡呢 大概是太久沒發東西了來湊數吧。函式式程式設計與命令式程式設計最大的不同其實在於 函式式程式設計關心資料的對映,命令式程式設計關心解決問題的步驟 這裡的對映就是數學上 函式 的概念 一種東西和另一種東西之間的對應關係。這也是為什麼 函式式程式設計 叫做 函式式程式設...