React學習之 函式式程式設計

2021-07-31 02:42:37 字數 2055 閱讀 7858

react把需要不斷重複構建的ui抽象成了元件,它充分利用很多函式式的方法減少了冗餘**。可以說,函式式程式設計是react的精髓。

那麼,到底什麼是函式式程式設計呢?

維基百科給出的解釋:

(注意星號*之間的內容。)

函式式程式設計(英語:functional programming)或稱函式程式設計,又稱泛函程式設計,是一種程式設計范型,它將電腦運算視為數學上的函式計算,並且**避免使用程式狀態以及易變物件*

*。函式程式語言最重要的基礎是λ演算(lambda calculus)。而且λ演算的函式可以接受*

*函式當作輸入(引數)和輸出(傳出值)*

*。比起命令式程式設計,函式式程式設計更加強調程式執行的結果而非執行的過程,倡導利用若干簡單的執行單元讓計算結果不斷漸進,逐層推導複雜的運算,而不是設計乙個複雜的執行過程。

也就是說,函式式程式設計和命令式程式設計最大的區別是:

函式式程式設計關心資料的對映,而命令式程式設計關心解決問題的步驟。

下面,為了更清晰的解釋,我們首先舉乙個命令式程式設計的栗子:

(翻轉二叉樹的左右子樹)

function inverttree(root)

if(root.left)

if(root.right)

var tmp = root.left;

root.left = root.right;

root.right = tmp;

return root;

}

命令式程式設計關心的是解題步驟,我們到底應該如何做翻**

var tmp = root.left

;root.left = root.right

;root.right = tmp;

而對應的函式式程式設計則為:

function

tree

(val,left,right)

function

invert

(node)else

}

函式式程式設計關心資料如何對映:也就是如何從舊的樹對映到新的樹。

介於這樣的目的,函式式程式設計就必須引入乙個很重要的概念:高階函式。

高階函式:引數為函式或返回值為函式的函式。
高階函式提供了一種函式級別上的依賴注入機制,也就是,高階函式的邏輯依賴於作為引數傳入的那個函式的邏輯。

另外乙個函式式程式設計且又是高階的栗子就是js中array的foreach函式,這個函式可以根據傳入的引數(也是乙個函式),對陣列中的每乙個物件進行操作。

另外乙個很重要的概念就是遞迴:因為遞迴正是描述了我們要解決的問題的定義(而不是如何解決問題)。

但是使用遞迴有乙個很讓人頭疼的問題:棧溢位。

為了解決這個問題,我們可以考慮採用尾遞迴的形式:

// 求解斐波那伽數列的尾遞迴寫法

function

fib(a,b,n)else

}

解釋一下:傳入的a和b分別是數列的前兩個數。每一次進入函式運算,都向前推進乙個數,那麼b就變成了計算中的第乙個數,而a+b就變成了第二個數。

這就是尾遞迴。

如果不使用尾遞迴,那麼求解斐波那伽函式的**應該是:

function

fib(n)else

}

對比兩段**我們可以發現,尾遞迴就是不要保持當前遞迴函式的狀態,而把需要保持的東西全部用引數給傳到下乙個函式裡,這樣就可以自動清空本次呼叫的棧空間。這樣的話,占用的棧空間就是常數階的了。

再確切一點,當遞迴呼叫是整個函式體中最後執行的語句且它的返回值不屬於表示式的一部分時,這個遞迴呼叫就是尾遞迴。尾遞迴函式的特點是在回歸過程中不用做任何操作,這個特性很重要,因為大多數現代的編譯器會利用這種特點自動生成優化的**。比如f(n, sum) = f(n-1) + value(n) + sum;會儲存n個函式呼叫堆疊,而使用尾遞迴f(n, sum) = f(n-1, sum+value(n));這樣則只保留後乙個函式堆疊即可,之前的可優化刪去。

Python學習之 函式式程式設計

1 函式式程式設計 1.1 匿名函式 關鍵字lambda表示匿名函式,冒號前面的 x 表示引數。冒號後面只能有乙個表示式,不寫return,返回值就是該表示式的結果。可以不必定義函式名,直接建立乙個函式物件。返回函式的時候,也可以返回匿名函式。下面的 是乙個例子 myabs lambda x x i...

Python學習筆記之 函式式程式設計

函式式程式設計的乙個特點就是,允許把函式本身作為引數傳入另乙個函式,還允許返回乙個函式。變數可以指向函式 f abs f 10 10函式名也是變數 abs 10 abs 10 traceback most recent call last file line 1,in typeerror int o...

Scala 學習(9)之 函式式程式設計

對相同的輸入,總是能得到相同的輸出。如果 f x 的引數 x 和函式體都是引用透明的,那麼函式 f 是純函式。指的是沒有 的函式 指的是狀態的變化 修改全域性變數 丟擲異常 io 讀寫 呼叫有 的函式 我們可以清楚的看到,呼叫xplusy v2函式的時候,改變了 x 的值,產生了 生產效率高 易於推...