僅僅就學習演算法,還是C++/Java/C#最適合。
首先,沒泛型的語言未必工作不好用,我司現在伺服端程式碼幾乎都是go,但是沒有泛型,寫通用的程式碼就是不好用。我用Go把半本【演算法】實作了一遍,移植了Haskell 的 Parsec 庫。這些程式碼大部份都在我團隊的專案裏實際使用。你要說 Go 有多熟練未必,但是要說它在語言功能上有多少坑我倒是挺熟悉。沒泛型的話演算法實作起來太坑人了,別的不說 float32/float64/int8/int16/int32/int64/int 這些數值類別你能都覆蓋麽?如果只是基於某一組有限的數據類別和問題領域實作一遍,用 go 倒是不錯,它環境配置容易,不太依賴ide,但是對ide還是比較友好的,天然整合test,編譯快速,模型簡單,學習容易,可以說是我用過的靜態編譯型語言裏最像動態手稿語言,最適合快速開發微型工具的。
其次,Python/Ruby 這類語言其實不太適合練習演算法實作,它們太「高級」了。例如用Python的時候,你很難規避它的內建容器List和Dict,這些東西封裝了太多東西,在學習的過程中容易被幹擾。另外沒有靜態的類別控制,在學習過程中也會失去一些知識。倒不是就會導致你後半生這部份都不能自理,但是需要另外學習。
在我的經驗,要學習演算法,C++/C#/Java 仍然是比較好的選擇,它們的泛型已經比較成熟,能夠在學習中建立比較完備的知識概念。可以找到一些比較好的IDE用,我個人其實在工作中不怎麽用IDE,但是演算法學習的時候,有個不錯的IDE可以幫你跟蹤程式碼的執行過程,還能比較容易的做效能分析,這樣就可以用動態、直觀、形象的視角去理解和觀察演算法。這對學習非常有幫助。
如果只是在一個特定的領域做知識學習的工具,其實C++反而不算很難,C++的難度主要在於覆蓋的領域太廣泛,當你要做一個專業的C++程式設計師,要掌握的東西就太多了。
個人不太建議用C去學習這些東西,需要處理太多跟問題本身無關的事情了。