算法是解決某類問題的統(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)融匯貫通。