其實還是有區別的,編程中的函數,稱之為方法,更為合適。

數學中的函數,代表的是一組關係。

編程的函數,更多的時候,代表的是解決一個問題的方法。


自變數是參數 因變數是返回值


編程中的函數和數學的函數是一樣的,即將每一輸入元素映射到輸出元素的一種關係。

Lua本身有函數式編程的元素,如果你有興趣以後可以學習一些函數式編程語言,如Haskell或Scala,在這種編程思維下,所有的電腦運算都看作函數。

較傳統的指令式編程將程序看作是一條條指令執行的集合體,函數式編程則將程序看作是輸入和輸出之間的映射關係。其基礎 [公式] 驗算本身就是一個嚴格的數學概念。

函數式編程有幾個優點:

  • 有完備的數學基礎,更容易理解其邏輯
  • 測試更容易,而且不太容易出錯
  • 非常強大,可以簡單實現高度抽象化
  • 和平行計算等概念很兼容

因為這些優點,即使不是函數式編程語言最近也有越來越偏向於函數式的趨勢,例如Java從7到8就增加了大量函數式功能。

函數式編程有一些表面的缺點,

  • 門檻高,感覺難學,這其實主要因為很多人在學校最早接觸的編程都是指令式的
  • 性能差,這主要因為早期函數編程沒有專門相應的數據結構,使用一般指令式編程的數據結構會導致性能變慢


數學上的函數,是固定的參數對應固定的函數值,中間過程不會產生副作用,即不改變任何參數的狀態。

而編程上的函數(方法),很多時候是為了完成某些功能,中間過程可以修改某些參數或外部變數的狀態,(可能)最後順便返回一個函數值。

類似數學上的意義,在編程中如果完全不修改變數的狀態,固定的參數對應固定的函數值,這時的函數(方法)會被稱為純函數以作強調。


如果簡單粗暴一點來回答的話,我猜測對於你現在的學習階段,不妨把(無論是編程還是數學中的)函數想像成一個微波爐:你放進去一點東西,它做了一下處理,等你取出來的時候可能就變成新的東西了。比如麵包變成了烤麵包,雞腿變成了烤雞腿,等等。這個微波爐就是函數。

編程和數學裡面也類似,比如把平方函數可以把2變成4,3變成9;加五函數可以把0變成5,-3變成2,等等。


其實無論是在數學還是編程中,「函數」這個詞都有一定的模糊性。

例如在編程裡面,過程、方法、(純)函數都可以被稱為函數,而且它們之間也確確實實有不少相似/關之處。

類似的,在數學中,尤其是中學老師們,常常把函數、方程、甚至曲線這幾個術語混用。

所以,如果你能提供更多的信息,比如課本裡面函數的截圖,也許能更好地幫助大家理解你的困惑。

PS:才初二就玩lua這種語言了,後生可畏啊!


我感覺這倆的區別大於相似,關係有些錯綜複雜不太好敘述。

先說二者的區別吧,根據平時寫代碼的經驗,函數是允許死循環的發生的(畢竟不報錯,也沒有警告),甚至有些程序是依賴死循環才能正常運行(比如操作系統)。但在數學上,函數絕對不存在死循環這個玩意,函數值要麼存在要麼不存在,沒有卡死循環算不出來這回事。

對於不存在死循環的編程中的函數(好tm彆扭),似乎一般稱為演算法。演算法在有些定義中是採用數學上的函數來構造的,定義如下(寫個大概,書不在手邊,詳細的參見《計算機程序設計藝術》1.1節,同時書中用這個方法構造了求最大公約數的演算法作為實例):

定義一個四元組 [公式] ,其中 [公式] 是狀態集, [公式] 都是 [公式] 的一個子集,分別稱為輸入集和輸出集,且 [公式] 不能是空集。 [公式][公式] 的映射,且對於 [公式] 中的任意一個元素 [公式][公式]

現定義一個序列 [公式] ,其中 [公式] , [公式] 。如果存在一個整數 [公式] 使得 [公式] 時有[公式] ,則四元組 [公式] 稱為一個演算法。序列 [公式] 可以看作是演算法在以 [公式] 為輸入時的運行步驟。

上面那兩段文字中,第二段明顯是為了限制演算法不能出現死循環,因此要限制在有限步驟之內演算法的輸出必須穩定下來。那麼去除相關的限制,似乎就可以得到計算機中演算法的相關定義,從這個角度就能看出二者之間的關聯了。

數學中的函數雖然是一個映射,看起來是個動詞,但實際上是個靜態的玩意,在集合論當中有時直接把函數定義為一種二元關係, [公式] 實際上只是表明 [公式][公式] 之間有一個確定的關係 [公式] ,是個陳述句。

編程中的函數更加傾向於動作,對於一個確定的輸入要有一步一步的過程來慢慢接近最終的輸出,當這個過程長度為無窮時,程序就陷入了死循環。構造輸出的單個步驟是可以用數學中的函數來描述的。

順道一提,在數學上有個概念似乎可以直接對應到編程中的函數上,那就是lambda表達式。這玩意屬於可計算理論上的東西,它的定義似乎完全不需要使用函數這個概念。用它可以直接寫出真正意義上的計算機代碼,但要寫出這種代碼需要很複雜的構造,所以這裡就不敘述了。(其實根本原因是我也只會基礎的部分)

再順道一提,lambda演算是計算機理論的開端之一,現在很多編程語言都引入了它的思想,有各種各樣的lambda表達式語法,是各個語言實現函數式編程的基礎,我看到有些回答似乎提到了它。


數學函數必須有參數,必須有返回值,而且返回值和參數必須是映射關係,計算機函數不遵循這個


初學階段,能具體的就不要抽象。剛開始的時候不要試圖從很高的層面來對比兩者(映射關係)。簡單理解,兩者沒什麼關係。不要試圖從哲學層面來理解這些工程問題。切記。


本質上說一回事。你就按編程中的函數理解就可以。

只不過數學用的符號和寫法與編程不同。


編程中翻譯成方法比較妥當


我覺得,數學裡的函數和編程語言里的靜態函數(方法)是相同的。


推薦閱讀:
相关文章