update:有道有兩道題,這裡特指第一道題,因為我沒仔細看第二題。
這幾天有道的兩個題目成了討論的焦點,大家貢獻了一些解法,貼出了自己的代碼,還引出了演算法重不重要、要不要OO一下的討論。在我看來,這幾天的討論是有問題的。首先,演算法有沒有意義,重不重要?
可以肯定的是,演算法是重要的。他是電腦科學的重要組成部分,廣義的說任何程式邏輯都是演算法,程式=資料結構+演算法 這一公式仍然成立,不管是不是OO。這個是不需要討論的,那些持“演算法不重要”看法的人,其實也是在說一個度的問題,到底在演算法上下多大的功夫,是要有一個比例的,不能光知道演算法就行了。
其次,要不要OO?
這個要看具體的演算法和使用演算法的要求了。就這幾天討論的蘿蔔問題的演算法來說,不需要。因為演算法本身很簡單,使用OO可能會增加一些代碼,造成不必要的複雜性。當然非要OO也不是不可以,今天就出現了兩篇OO的實現。
好了,討論完這兩個問題,該說說為什麼這幾天的討論是有問題的了。
看看這幾天相繼的幾個實現代碼貼出來,都說自己的演算法比前面的快,但是快多少呢,為什麼快呢?仔細看看,無外乎就是少嵌套了幾個迴圈,少做了幾次Convert的耗時操作,演算法的複雜度還是O(n),根本就沒有本質的變化。這到底是在討論演算法呢,還是討論怎麼實現這個演算法呢? 如果大家真的認為演算法很重要,為什麼比來比去比的都是實現呢?為什麼沒有人提出一個與別人不同的演算法呢?
再說說實現,一道如此簡單的題目,僅僅答案對了就滿足了嗎?程式的可讀性呢?我從第一篇代碼開始看的時候,就沒發現有演算法的文字描述,清一色的“看代碼”。看代碼也行,本來以為簡單的問題掃一遍代碼就行了,哪知道愣是沒看明白。方法很長,嵌套的迴圈很多,ijkl不知道是什麼,恕我愚笨和懶惰,這樣的代碼我看不下去。可能會有人說,這麼簡單的代碼還搞那麼多幹嘛,仔細看看傻子也能看的明白,等我寫大型軟體的時候,就不這麼寫了。這不是簡單或是難的問題,這是一個習慣的問題,習慣一旦養成就很難改了。而且把代碼寫清楚並不是一件容易的事,就算你想在什麼時候將代碼寫清楚,因為平時缺少練習,也未必就能在關鍵時刻寫出來。這個問題可能我花10分鐘仔細看看也能看懂,可是當你面對萬行以上這樣的代碼時,還能這麼從容嗎?
我不管OO不OO,但是我希望代碼能夠清晰易懂。
PS:發點牢騷,還罵了很多人,預料到會有人罵我,沒關係,讓暴風雨來的更猛烈些吧。