學習編程時應該更注重語法還是演算法?


你走路的時候更注重小腿還是更注重大腿?學習寫作的時候更注重句子還是更注重段落?

這兩個比喻不是很恰當,但是有些方面和這個問題是相同的。首先,語法和演算法都是基本的,丟了哪個都不行。第二,語法和演算法都是基本的,它們在編程學習中所佔的比例總共不會超過一年吧?犯得上顧此失彼嗎?

再舉個不恰當的例子,如果你覺得可以通過省掉這兩者中的某一項或者把某一項學的夾生一些來優化你的編程學習之路,不妨想想簡化字這個東西到底真正幫助消除了多少文盲。想想漢字本身的認讀到底在我們的學習生涯里佔多大比重。這個東西除了讓人再也不能書寫正體字之外毫無意義。

優化一個東西要想清楚是不是 hotspot 。否則就是 premature optimization 。


不懂語法演算法好不到哪裡去。演算法固然是一種思想,但是只有結合具體一門語言才能實現。

意思就是你至少要熟悉一種語言的語法,才能可以開始學演算法。

偽代碼只是方便表達演算法的思想,但不實踐只是紙上談兵,不實踐不會深刻了解某個演算法的精粹。很多演算法很難單憑口讀來理解,一敲代碼,調試一下就容易明白了。

在實際項目中,演算法的精粹在於高效解決問題,熟悉語法對提高效率也很大幫助。

比如C++里,++i 和 i++,兩種語法,後者會產生臨時變數,如果單純自增,為了效率優先使用++i。

--------------------------------------------------------------------------------------------------------------------

PS:有朋友不太重視這樣細節。說做了簡單的實驗測試得沒什麼效率差別。我估計他只是做少量數據的測試。

其實單運行一個語句區別是不大,但大量重複某一個語句,差別就巨大了。

在++i 和 i++里,如果i是一個線性表類,裡面儲存大量的數據,複製構造函數里有拷貝數據的動作(很常見),每產生一個臨時變數就需要執行時間複雜度為O(N)的拷貝數據的動作。那效率差別就大了。

這些細節不會太難,注意一下就能掌握了,何樂而不為呢。


兩者不在同一層級,沒辦法也沒必要比較。演算法不局限於某一種語言,而語法只適用於某一特定語言。當然,語言並不應該是coding的一種障礙。初學時不可避免的要注重語法。進階時,語法或者語言都不應該是被過分強調的概念。精通兩三種語言熟爛於心,其他語言都可以通過閱讀tutorial 和api迅速掌握。基本演算法應該靠條件反射記住。稍微複雜的演算法都可以通過查找psudocode了解學習。要問coding應該注重什麼,我認為更應注重敲代碼的速度和規範程度,以及良好的engineer習慣。


在精通了一門語言之後,我強烈建議把盡量多的時間放到演算法本身上而非去學第二門第三門語言。尤其考慮到多種近似的語言有時反而會讓你混淆(比如在CPP/C#/JAVA之間跳一度就讓我總寫錯。。。不過我程序猿資歷不深總共也沒寫過十萬行代碼。)

真正的價值,是通過演算法的深度體現出來的。若是見到號稱會十種語言的那種人,我第一感覺不是敬佩,而是深刻懷疑此人是臨時工出身。。。


語法錯了,編譯都過不去啊。演算法錯了,過了編譯得不到結果。演算法差一點,運行慢一點。

不管怎麼樣,語法確實是基礎,而且其兩者者是沒有矛盾的。


這個問題很奇怪,就彷彿說,學習中文寫作是否需要認識中文字一樣可笑。

語法是內功,演算法是套路。——語法是一切的基礎,沒有語法,你根本無法掌握演算法。

就算你寫了千萬個演算法,可是你不懂語法,寫的程序連編譯都無法通過,你連測試你的程序都不行,你有資格談演算法么?

所以說了,雖然演算法比語法更有用,但是不懂語法確實萬萬不能的。


先掌握語法。而且先掌握一門Native語言,比如Pascal, C, C++。理解透了語法之後再去研究演算法,提高你的代碼的效率和精度。是的,精度。

一個了解了編程工作所有原理和環節的人學習一門語言也就一個月不到的時間。如果是現在流行的託管代碼到runtime的語言學習起來更快。因為甚至不需要研究底層的指針等知識。

我的建議,兩者都不可少。只是有一個順序問題。語法是基本功,演算法是靈魂。


我以為演算法是本,語法是綱。理解了演算法,如有需要,可以用各種語言來實現。但前提是,你知道該怎麼去實現。所以,學好演算法是一勞永逸的事;但若離開了語法支撐,那將永遠是趙括紙上談的兵。


學習計算思維,編程思路。

計算思維(Computational Thinking)概念的提出是計算機學科發展的自然產物。第一次明確使用這一概念的是美國卡內基·梅隆大學周以真(Jeannette M. Wing)教授。計算思維是運用計算機科學的基礎概念去求解問題、設計系統和理解人類的行為;計算思維最根本的內容,即其本質是抽象和自動化。

如果只學語法,不能自己寫代碼解決問題。

加油!


作為一名曾經計算機專業的學生,個人覺得,剛開始學編程時,應多注意語法問題,比如封號;引號 「 」 花括弧 { }等的書寫,甚至代碼的排列,這些小問題雖說不是很顯眼,但是當以後我們寫的代碼需要寫100行,甚至1000,10000行時,一個小小的問題都有可能影響我們的結果,儘管現在的編程平台都有糾錯功能,但僅僅都是語法上及其簡單的小問題,但是,頭腦簡單的電腦是不會像我們人一樣考慮問題,比如稍稍複雜一點的演算法問題或者是自己的筆誤,這些都是我們在初期必須注意的問題,這就好比任何學任何東西,你的基本功越紮實,後來的成就也就相應的會多大,對於這些基本功的重要性我也不在此多說,相信誰都知道哈。

然而,在基本功紮實之後,對於一些簡單的問題,演算法的作用不是很明顯,但是當你的問題是複雜的,演算法的重要性不言而喻,一個優秀的程序在於它的效率,而優秀的高級的演算法會使你的程序效率高的驚人,之前我做飛思卡爾智能小車時,硬體要求很苛刻,內存只有8M,這時對演算法的要求就相當高了,複雜的程序根本不好使,計算速度太小,之後我嘗試一個老師推薦的高級演算法時,好多問題都迎刃而解,效率高了好多,我之前弄了好長時間的程序,好長的代碼,最後還不如那短短的幾行高級演算法代碼,到這,你應該能明白我想表達的,不多說了,你好好學習編程吧,這東西只要入門就不會很難,希望能學好哈。


學習編程最重要的是實踐,也就是寫代碼,寫代碼的前提肯定是語法要熟悉。可以在此基礎上針對問題不斷的優化演算法,提高思維的能力。


語法是基礎,不管你做哪方面的開發,學習一門語言最根本的就是首先掌握語法,至於演算法,那就跟你具體的工作有關了,有些開發工作可能對演算法要求並不高,只需要使用一些最基本的演算法就可以,而有些可能需要的就是不斷優化演算法。


語法很難么?大家吭哧吭哧講了半天。一個語言語法最多不超過一周搞定,快得python半天;演算法難度無上限,根本沒有可比性。問題中語法改成慣用法和模式還差不多。


從演算法的角度來看,對於純面向對象的託管語言要求就不像Native語言的要求那麼高,而面向對象的Native語言對於C語言來說,程序員需要對演算法的理解程度就要低一些 。

面向對象的語言需要關注的更多是數據結構和生命周期,而C語言更多關注的是流程,演算法。

「過多的關注工具的使用,那純粹是在浪費時間.」

---Andrew Koenig (Rumination on C++ 作者)。

語言也只是實現目的工具,抽象才是編程的核心。但是工具都用不好的人,編程水平也不會太高。


學編程當然學語法,不用學演算法。演算法跟編程沒太多關係。但是你要是學軟體開發,就得學演算法。


編程相當於寫文章吧,語法類似於你知道什麼地方該用什麼詞語,演算法就相當於你的文章的文采優美不優美,語句通順不通順。是不是可以做到深入淺出


我認為兩者的關係是,語法是基本,演算法是程序設計的骨骼。

如果你只學演算法,不學語法,那麼寫的就是偽代碼;

如果你只學語法,不學演算法,無論你學習多少種語言,你都不能寫出好的程序。


編程語言變了又變,從C到C++再到Java,還有幾十種編程語言等著你,在語法上各有特色,但是演算法和數據結構基本不變,我聽說很多編程語言落伍了甚至被淘汰了,但是演算法巋然不動。


注重抄代碼


我覺得這個是分階段的..

第一步:如何掌握一門語言,了解他的語法,語言特性,能實現各種模塊功能是首要的..

第二步:代碼寫多了,功能寫多了,你就要需要思考如何讓模塊功能跑得更加順暢,穩定,高效,這個時候演算法,具體的實現方法是首要的.

第三步:然後漸漸你會發現,各種語言只是一個工具,他們有不同的特性,和適用場景,不同的演算法,模塊功能用不同的語言處理起來效果也不一樣.這個時候你就開始學習第二,三,四...N門語言,發揮他們各自的特性,讓合適的語言,合適的技術做合適的事情...


我就想問問,那些說語法沒有演算法重要的人,你們是如何把有錯誤語法的代碼編譯成功的?………

語法和演算法根本是兩個層面的東西好么,語法正確的基礎上才能接下來談演算法。

語法是讓你的程序先能跑起來,演算法是怎麼讓它跑的更快更好。


個人認為,比較注重語法。如果你是要寫一個程序的話,演算法你可以和別人一起討論而得出結果,而且往往比較難的問題,你也不可能一個人就可以解決,肯定要靠團隊的力量。而語法,這是你寫一個程序的基礎,如果你基礎也沒有學好,你怎麼去和別人配合?你怎麼繼續後繼開發呢?


推薦閱讀:

軟體開發和軟體測試,我該從事哪個方向?
如何看待CCF在每年選擇最後一題的賣萌行為?
圖形學初學者,如何學習Polygon Mesh Processing這本書?
編程有可能娛樂化(遊戲化)嗎?

TAG:學習 | 演算法 | 編程 |