回覆列表
  • 1 # IT劉小虎

    在數學中有各種各樣的數學函式,比如 sin ln 等函式,sin(pi/2)=1,ln1 = 0 等等。

    C 語言中的函式

    在 C 語言中,我們當然也可以使用這些函式,請看如下程式碼:

    math.h 中包含各種數學函式的目錄,只要將其用 #include 匯入,在 main 中使用 sin,log 函式時,程式才知道從哪裡找這些函式。我們在 codeblocks 中執行它,輸出如下:

    在數學中,使用函式時可以省略括號,例如 sin pi/2,而 C 語言中的函式則一定要使用 (),例如 sin(pi/2)。在C語言的術語中,pi/2是引數,sin是函式,使用 sin(pi/2) 就是程式設計師常說的“函式呼叫”。

    C語言函式的“副作用”

    事實上,printf(“…”,…); 也是一種函式呼叫。但是 printf 感覺不像一個數學函式,為什麼呢?因為像 sin 這種函式,傳遞一個引數給它,它會返回給我們一個計算後的值,我們呼叫 sin 函式就是為了得到它的返回值。至於 printf 函式,我們並不關心它的返回值,更關心的是它的“副作用”(計算返回值的過程中,往控制檯列印的字元。)。事實上,printf 也有返回值,它返回的是實際列印的字元數。

    C 語言函式可以有“副作用”,這是它與數學函式的根本區別。

  • 2 # 小宇堂

    計算機函式和數學函式都是函式。如果抽象地來說函式的意思就是一個輸入產生一個輸出,那麼這個輸出就是輸入的函式。輸入和輸出之間的這種關係叫做函式對映。

    上圖:函式的基本定義示意

    不管是計算機函式,還是數學函式,它們都符合函式的這個抽象定義。

    函式的要素

    輸入

    輸出

    單向有序對應(輸入對應到輸出)

    上圖:這是函式,因為不同的輸入值有唯一的輸出值。

    上圖:這不是函式,因為相同的輸入值對應了不同的輸出值。

    換一種你可能覺得匪夷所思的方式來描述函式,可以這麼來講:

    函式實際上是一個兩兩有序配對的集合,一個X值僅對應一個Y值,但一個Y值不一定對應一個X值。這個X與Y值的配對的集合G就是函式的圖,如果用座標系表示就是我們經常看到的那種函式曲線圖。

    上圖:一個典型的函式曲線圖。

    從形式上講,函式圖和函式是相同的東西,但函式圖隱藏了函式作為某種過程的內涵。因此,在通常的用法中,函式和函式圖是區分開來講的。

    y=f(x)這種表示法就代表了x透過一個函式的過程f,對映(或者輸出)y的全部含義。

    此外,函式也稱為對映,雖然“對映”和“函式”之間還是有一些差別。

    函式的基本定義是數學的函式和計算機函式通用的,否則就不叫函式。下面我們分開看下數學函式和計算機函式的異同。

    數學的函式

    函式最早就是在數學領域定義的,因此數學的函式的定義基本上與上面講的函式的基本定義類似,但是數學的函式限定函式的輸入和輸出物件必須是數,而不是其它什麼貓貓狗狗。

    你不能說我有一個函式:f(x),然後當x=貓,算出來f(x)=狗。

    這樣的函式在數學上不成立的,其根本原因在於數學的運算只能適用於數,這裡的x代表的是一個數,只能從數的集合當中選取。

    如果我們把上面的例子再複雜一下,例如:

    函式f(x)=2x+1;但你要讓我算當x=貓時的函式值,那我最多可以代數推理到這一步:

    f(x)=2貓+1,但是2x貓是什麼含義,2貓能跟+1運算嗎?顯然不行,這哪裡哪呀?完全是牛頭不對馬嘴。

    所以,數學的函式,限定了函式的取值範圍是“數”!

    這和計算機的函式就有了差別。

    計算機的函式

    計算機也是建立在數學的原理之上,從計算機的本質上講,計算機就可以被視為一種函式——一種物理實現的函式,它有輸入,有輸出。至少從物理原理上講,它是以電脈衝訊號作為輸入,並輸出電脈衝訊號。而且計算機確保了函式的一個最基本特徵,即有序對應(或者說對映),相同的輸入對應相同的輸出,絕對不能出現相同的輸入居然產生不同的輸出的情況。所以,計算機本身就具備了函式的某些特質。

    上圖:計算機的基本功能是不是跟我們前面對函式的基礎定義的圖示有些相似?

    拋開計算機的物理硬體屬性(硬體部分)來說,單看計算機的邏輯屬性(即軟體部分),也就是基於計算機的運作方式而保證成立的那套運作機制,恰恰就是數學函式。計算機的軟體部分可以完全被視為純粹的函式,這一點問題都沒有,因為計算機的軟體體系完全符合函式的基本定義。

    只不過,計算機軟體設計人員利用計算機高階程式語言的設計思路,將數學函式的原理和描述方式引入到了計算機的設計和計算機的程式設計開發當中。並且將複雜的概念建立在了數學函式的基礎上,實現了計算機最重要的操作和行為概念(我們用計算機可不是僅僅用來做算數)。這更強調了之前函式的通用定義當中關於函式是一個“過程”的內涵。

    計算機的程式語言不是給計算機看的,而是給程式設計師看的,是方便程式設計師自己知道自己想讓計算機執行什麼指令。雖然程式設計師輸入的是一些程式程式碼,但實際上這些程式程式碼最終會被編譯為數(包括指令和資料等等)。

    上圖:程式的流程圖:大量函式相互連線就構成了複雜的邏輯操作體系。

    但實際上計算機的操作和行為,最終落到計算機的硬體底層都是建立在數字訊號的基礎上的,這種操作和行為實際上就是大量函式的宏觀集合——透過運算實現對現實世界的反映和反饋。

    舉幾個典型的此類操作的例子,看看它們是如何由函式構成的:

    計算機指令——實際上是一系列的編號以及相關的引數,每一條計算機指令都定義了輸入值x,計算含義f,指令執行後會產生對應的輸出值和相關操作(以數字訊號的方式)。

    對計算機記憶體的讀、寫——實際上是輸入一個地址值,輸出該地址固定長度的資料的值。

    對特定裝置的操作——實際上在一系列的記憶體地址寫入各種數值,然後以一個數值請求處理器控制特定的裝置來讀取這些資料。

    顯示屏顯示影象——是以視訊記憶體內的大量數值作為輸入,以螢幕上的矩陣作為輸出(矩陣也是數的一種形式,至少矩陣可以等效於一個數的有序集合)。

    上圖:記憶體的定址就是一種典型的數值控制的操作,一串10的組合決定了應該從記憶體當中的哪一塊提取資料。所以像記憶體這個裝置輸入數值,即可獲取另一串輸出的數值。記憶體也是一個函式。

    上面是從計算機的底層機制來說的,也就是說計算機的底層完全是基於函式的,所謂的計算和操作一切都是函式。

    上圖:高階語言(人可讀的指令)是如何變成CPU可讀的指令,一切都會落到01構成的數值上,作為CPU的輸入得到處理。這些數值不僅提供了x,也提供了f,應該說是高層的f,意思是處理資料的方法。高層的f會被變成底層的f,從而會被CPU執行(實際上CPU只知道少量的固定的底層的f)。

    而對於計算機程式語言當中的函式來說,函式就具備了更高層次的含義。諸如一個C語言的函式,或者java語言的函式……

    這些函式在另一個層面上體現了一些與數學上函式的不同。由於計算機高階語言品種非常多,我這裡也就不過多展開,只說一點點抽象的共性:

    在高階程式語言當中,函式和過程(routine)具有類似的含義或者本質,這是對函式"過程"含義的強化,也就是前面我們提到的那個f()的含義。

    我們在類似C語言系的語言當中,函式、過程和方法等概念具有類似的含義。這些概念更突出函式的過程屬性。即在函式的運算之中,會執行一些操作,帶來一些後果,重點在於這些操作和操作的後果,而不在於函式的輸出值。但實質上,這些操作的後果也就是函式的輸出值。

    透過函式集合的宏觀化,函式就變成了“宏”(macro)——一種具有動作屬性的整體概念,即操作。讀到這裡,讀者應該可以聯想到為什麼excel裡面的VBA程式會被稱為“宏”。

    實際上宏就是一種動作,或者操作的集合,其目的不是給出輸出的數值,而是給出一系列動作。但歸根就底,宏也是建立在堆疊的函式的基礎上的,是一個封裝的整體概念,它不過是強調了函式的過程屬性而已。

    上圖:Excel中基於VBA的宏程式示例

    小結一下:

    計算機由於具備了強大的計算能力,於是可以高效地處理大量的函式,因此在此基礎上,人類使得計算機的軟體體系形成了“操作”的概念,因為我們不僅僅是想要計算機透過複雜的函式計算告訴我們一個最終值,而是需要計算機透過計算出來的大量的值去做一些事情。這是將計算力變成生產力的關鍵。但不管操作也好、宏也好、其微觀都是建立在單個簡單的函式的基礎上的,其原理也是建立在數學函式的概念之上的,輸入-過程-輸出的對映是計算機的基本原理。當硬體確保了這種基本原理的穩態運作,就成了計算機。即便用這樣的定義去衡量華人發明的算盤也是一樣的道理。

    總結

    數學上函式的概念是計算機函式概念的微觀原理基礎。計算機發展到高階階段之後,計算機函式的含義更多地強調了函式的過程特性,從而形成了強大的操作能力,雖然這種操作能力最終是由硬體來實現的。但無論怎麼發展,計算機函式的內涵都是符合數學函式的內涵的。

  • 3 # 日衝資訊 黃

    計算機函式和數學函式都是描述資料集合之間的關係,本質上二者是一樣的。只是數學函式的資料集合可以是連續的無限的實數集合,而計算機函式的集合只能是間斷的有限的有理數集合。

    直接對應數學函式的計算機函式比較容易理解。比如各種運算子號,數學函式等等。帶有某種功能的函式則看起來跟數學函式很不一樣。比如,shutdown()。之所以這些函式看起來不像是數學函式,只不過是因為您不瞭解它背後的數學模型而已。以shutdown()為例,它其實是輸入條件和輸出結果之間的對映關係。這裡輸入條件可以是一堆引數(自變數)的值,而輸出結果也是寫到開關的值(0,1)。

    所有計算機函式都是若干組個數有限的數,因此可以把這些數寫出來,然後,按照演算法的要求做查詢。這一點對於那些有連續無限個數的數值的數學函式,是很難想象的。舉個例子,大多數語言中都有一個取隨機函式的函式,原本覺得這個函式挺神奇的,但是,後來發現它不過是用了一個演算法來描述一個隨機數的集合而已。於是我自己寫了一個隨機數的函式:先隨機生成10萬個數,然後順次去取。這個方法被用到了一個自動生成隨機密碼的系統之中。由於不用每次都算一遍隨機數,效率還是蠻高的。

    國外的很多學校沒有計算機科學和技術專業,取而代之的是計算工程專業,這些專業中不教程式語言,而是教很多數學建模的知識。有這樣一道數學建模的習題我至今還記得:證明由直系親屬繼承遺產的法律存線上程衝突的破綻。

  • 中秋節和大豐收的關聯?
  • 太空為什麼是黑的?