天天看點

買了一本書《Programming pearls》程式設計珠玑(88上的數學題目(1))

我覺得這真是一本不錯的書,正是符合我的喜好的一本書。恩,是以我還是買了原版回來,盡管我的英文水準有些差勁。我注意到有網上一個人評論說,裡面有些雕蟲小技而已,對于大的項目可能不适用,或者在現代計算機記憶體,cpu速度都很強的情況,有些問題不那麼在乎了。

我對這個評價覺得很不滿意,尤其是将“智慧”所稱雕蟲小技,更是感到不認可。我覺得這本書想講解的其實不是投機取巧的東西,而是完全為了是鍛煉程式員的思想層次上的東西。這些也是決定一個程式員素質高低的關鍵。

技術可能會更新,湧現新的語言,工具和方法,環境等等,但是思想則會更持久,而這本書主要叙述的是思想,視角,從這個層次上提高效率和優美性。

我也看到了另一本書,是effective系列中的effective c#,我覺得這本書也是我比較需要的,因為裡面有一些問題可能我并不是非常清楚。它主要的是幫助不太了解這些問題的人了解這些問題,了解編譯器的喜好和個性,進而讓你更有效的使用這個IDE,讓你了解影響你的代碼效率的比較底層的對你透明的一些東西,進而可寫出更符合編譯器口味,更有效率的代碼。這和思想和算法層次是不同的,這主要是從進階語言特性等方面來提高代碼效率,教給你良好的習慣和摒棄不良的代碼習慣。它的層次更接近應用層,與語言,ide特性更相關。

而pearls是比較抽象的,我在書中看到的叙述感到非常有趣,因為作者提出問題後經常會給這個問題實際中的例子,這就非常有信服力,讓你覺得這些智慧确實有用!我很喜歡,因為這些絕非投機,而非小計,而是智慧!不然,你覺得算法是什麼,它就是一種抽象的方法,一種很強的智慧操縱後的解決方法轉換處理(從人的直覺型邏輯思維習慣轉換為代碼的過程控制型習慣),一種智慧的結晶。

這本書裡面提到另一個人提出了一句話,而這句話恰恰也是作者的想法:A problem that seems difficult may have a simple, unexpected solution. 我想我确實是不太信任别人的翻譯的,是以我要買回原版。因為中文表義具有一種模糊性,就是模棱兩可,而英文表義具有一種确定性,即它的一些動詞的語态與時間,被動等等結合,它可以更準确無歧義的進行描述。而且中文譯者裡面的素質也是良莠不齊的,可能得到公認和信任的也就是侯捷先生了,從他在前面列出一系列的詞語對照和原因解釋就能看出他的責任心和工作态度。回過來這句話,一個看起來很困難的問題,可能具有一個簡單的出人意料的解法。嗯,我想這句話來描述優美的算法和代碼非常恰當!

——————————————

比如說我在88上遇到的這個問題:

1,1,2,2,3,3,4,4,5,5這十個數字,要求排成一排,是兩個1之間有1個數字,兩個2之間有2個數字,...,兩個5之間有5個數字。

怎麼排呢?你可以在紙上嘗試一下,無論如何,你都做不出結果,因為這道題無解。

怎麼證明它無解呢?老實說,我雖然看到提示說用奇偶性證明,但是我沒有想出怎麼回事,而是用tc周遊搜尋了一下發現沒有任何輸出。證明的方法我覺得這也可以說是另一種智慧能力的展現了,但是其實過程很簡單:如果給 10 個數字從 1 到 10 進行連續編号,則顯然這組編号必定由 5 奇數 5 偶數組成。

我們假設具有一個解滿足題目要求,現在我們再次對這個解從 1 到 10 重新編号(顯然仍由 5 個奇數編号和 5 個偶數編号組成):

那麼考慮這個解裡面的局部(子串):

1*1, 3***3, 5*****5,  這三對的數字(1,3,5)的編号的奇偶性相同。也就是(奇奇,或偶偶)* 3;

2**2, 4****4, 這兩對數字(2,4)的編号的奇偶性不同。也就是說(是1奇1偶)* 2;

可見,解的編号具有偶數個偶數和偶數個奇數,和 5 奇 5 偶沖突!是以無解。

證畢。

繼續閱讀