數(shù)學和算法

算法是解決某類問題的統(tǒng)一范式,如果你剛接觸它,你可以類比成你數(shù)學中的各種公式或定理,基于這些公式我們可以解決相關(guān)的一類問題,數(shù)學中定理和公式大致也是如此。不過我們做數(shù)學題時,雖然有公式定理,但是問題都是變形過的,無法直接套用,算法也是一樣的道理,所以從數(shù)學的角度去看待算法,你會很受啟發(fā)。

很多人會把算法看成是一個人編程能力的體現(xiàn),因為邏輯思考能力好的人編程應該也不會差。不過在我看來,不管是計算機算法還是編程,更多的是人對事物抽象能力的體現(xiàn)。

一個人算法好,不一定能寫出好的程序,但是一個人如果抽象能力好,肯定更容易寫出好程序。

但為什么數(shù)學好的人普遍編程都能學得很好,因為TA們比其他人更擅長理解、抽象和轉(zhuǎn)化范式。

我們以一個遞歸算法舉例

在數(shù)學和計算機科學中,遞歸指由一種(或多種)簡單的基本情況定義的一類對象或方法,并規(guī)定其他所有情況都能被還原為其基本情況。
這是遞歸的正式定義,是不是覺得很像數(shù)學課本里的那些定理。接下來我們就按照以前學數(shù)學定理一樣來學習遞歸。

定義已經(jīng)有了,但是好像看的不是很明白,說的太官方了。所以我們需要用更樸實的語言描述出來:一種通過重復將問題分解為同類的子問題而解決問題的方法。

接下來我們會看看有沒有公式,很可惜,遞歸沒有像a^{2} + b^{2}= c^{2}這種公式,但是不要緊,沒有公式,有形式,從形式我們可以推導出范式,比較經(jīng)典就是斐波那契數(shù)列算法

function fibonacci(number) {
    if (number <= 2) {
        return 1;
    }
    return fibonacci(number-1) + fibonacci(number - 2)
}

同理,我們還能想到很多的形式,比如階乘、漢諾塔......

從這些形式中我們好像慢慢找到了感覺,我們發(fā)現(xiàn)了遞歸算法兩個要素:
? 調(diào)用自身
? 能跳出循環(huán)

學到了這些,我們基本可以去用遞歸解決問題了。想想學數(shù)學時你時怎么做的,學完后你通常會做大量與之相關(guān)的習題,這些題很多都是公式的變形和巧妙應用,之后你對這類題型便無所畏懼了。如果遵循這種思路學習,算法應該不會很差。

不過受數(shù)學的啟發(fā),還發(fā)想到另外一種方法:你不僅會用這個公式,你還能夠反向構(gòu)造出用到這個公式的問題、場景,這是一種很難,但是也很有效的方法。從解題人到出題人,從簡單練習向高級練習的跨越。具備反向思考和構(gòu)造的能力,才能真正實現(xiàn)融匯貫通。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容