【前言】本文以資料結構為例。但關於理論和實踐的關係,以及學習路線,對其他課程、學科也有參考價值。
【正文】
有學生問:「資料結構應該偏理論還是偏實踐?」
這是乙個非常好的問題。
我知道,他是在學資料結構中有壓力了,想去偏一偏。
這是乙個選擇問句,但若回答,還真不是順著這個道二選一就了事。
(一)理論和實踐
先分析一下何為理論,何為實踐。
理論是從大量應用中提取出來的共性的特徵、原理。理論層次的知識,是大家智慧型的結晶。對當下的學習者而言,就是前人的積累。理論這種間接經驗的學習,可以讓我們在很短的時間之間,接受前人需要幾十年,甚至成百上千年的積累。
理論,是在學習中,尤其中在大學的學習中,極其重要的部分。不掌握專業中基本的理論,上大學的成色不足。只憑著有限的直接經驗和體驗,而放棄前人的積累,虧大了。不拿,白不拿啊。
然而,理論的學習,卻常常是枯燥的。學習者,不,往往是欲入門而不得的初學者,會由於這種枯燥而急燥、心焦,甚至產生厭惡,萌生放棄的念頭。
這不是理論的錯,是學法的錯。
理論本來是鮮活的,理論的學習也可以是鮮活的。
如何鮮活起來?
需要實踐來出場了。
在學理論中,要融入實踐。從實踐中,得到的是直接經驗,是屬於自己的體驗、體會。
在大學生階段學習過程中做的實踐,可以算是對知識初步的應用。通過實踐的行為和過程,你會發現理論的確是在指導著實踐,理論這個東東真是有用啊。在思考實踐問題的解決方案時,你會發現理論傳達的那個思維方式在起作用了。甚至於,解決實際問題時,理論裡的那些個公式、演算法直接拿過來用,真省事!
有了高度概括的理論,具體問題的解決,變得很容易的樣子。
有了實踐,再也不會說「老師教的這些東西全沒用」。去除了這個心魔,學習的主動性,這個學習的法寶,自然就留在你身邊了。
實踐,其實是我們學習的最終目的。從這個角度,理論是階梯。最終我們有創新的實踐,也會進入到理論體系中,成為後人可學的寶貴的間接經驗。你在達成自己目標的過程中的間接成果,再次成為後人的階梯。
實踐,也是我們學習的手段。不去結合實踐的理論學習,注定是枯燥的。有個別的人,在純理論堆裡得心應手,那自有他的道道。但是,現在對於感覺理論枯燥的人,你缺的,是實踐。
(二)理論和實踐的層次
現代科學體系變得越來越龐大,形成了各個分支,每個分支中又形成了多個層次。
這個層次的存在,使得理論和實踐沒有了絕對的區分。
換句話說,同乙個知識點,在有人眼裡是理論,有人眼裡是實踐。說它是實踐的人,是站在學科更高層次的;說它是理論的,常是剛入門者。
小學時學1+1,其實已經進入到符號思維的層面了。這是理論,因為你再不用具體到1個蘋果或1個小朋友的層面了。而到了小學高年級學到a+b的時候,**算的交換律、結合律之類的,1+1不就是很具體的應用了嗎?
說大學。高等數學、線性代數,數學類的科目,是理論。但若學一下泛函分析、近世代數,那些分明很具體了呵。顯然,學泛函、近代前,先學高數、線代。
說計算機類專業的學習。資料結構、資料庫原理,初學發現是理論,大部分人也這麼說。聯絡離散數學想一想,這不全是應用層面的實踐嗎?
而資料結構,確是理論。這是站在程式設計的角度說的。做各種專案,用各種語言,隨便你要解決個什麼問題,資料該如何表示,如何儲存,在特定儲存結構下,基本運算該如何實現,這些都是真實應用需要的基石。
前面說的在純理論堆裡得心應手的個別人,是將你眼中的理論當應用的人。
理論和實踐有層次,但千萬不要理解偏為社會分工有高低。隨著長大,我們總要在行業、學科中的某個層面找到自己的位置。社會的需要,每個人的生存、發展,需要有多個位置,各個位置上都需要有人做事。哪個層面的工作做得得心應手了,那都是專家。
不管哪個層面,都需要嫻熟於自己那個層面的實踐,要熟悉直接支撐自己工作的那個層面的理論,對這個理論背後的理論有一點點了解,直到你再也不必了解的那個理論的理論層面。
是的,隨著學習的進展,自己要成為專家,成為高手的那個層就要定下來了。對你而言,何為理論,何為實踐也就定下來了。
(三)資料結構該如何學
大學是專業學習的入門階段。
資料結構,是大學專業課中的「專業基礎課」,這是大家的共識。這樣的表述,意味著資料結構就是承上啟下的。若說學某語言及其程式設計是1+1的話,資料結構就是a+b,後面還有解析幾何、微積分。有了程式設計的直接體驗,可以學資料結構,學資料結構中的理論,做資料結構層面的實踐。等學過了資料結構了,作業系統、網路原理之類的課中,張口就是堆、棧、樹、圖,老師都不用多解釋一句。
資料結構是理論,也是實踐。
資料結構不是理論,也不是實踐。
看你站在哪個角度講。
在學習資料結構的時候,理論和實踐要同步上。每一種邏輯結構,要解決的問題,資料的表達、儲存,基本運算的實現,演算法的複雜性,是要學的。光看懂書,能說明白不算,把這些東西能變成**,這是科班人員的基本功。基本功是靠練才能出來的。
為了學的感受好一些,為了能解答所學知識用在哪兒,怎麼用,用所學解決點問題,也是應該的。這些東西要靠著老師講,一是講不了,二是他講了不算,你做了才行。
據此,對於要成為電腦科學與技術的科班人員而言,資料結構中的理論和實踐,兩手都要抓,兩手都要硬。
說「我會實踐」就行了的,我覺得可惜。能做出來是一回事,你要清楚到底做得好不好,怎樣做才是好的,是需要點理論的。會做的,一抓一大把,我們缺少的,是能做好的。
說「我把書看懂了就行」的,我表示懷疑,可以混個及格還可以。經常,做一做實踐,你會發現你未必真懂了。
產生「偏理論」或者「偏實踐」念頭的同學,是遇到困難了。是進大學後,在學習上欠了賬的。
知道要實踐,但一看**就頭疼,程式設計的實踐沒做夠,甚至程式語言層面的知識都不過關。知道理論很重要,但學不下去,是理論之前的理論不紮實,思維跟不過來。而不紮實的理論,和沒有經過實踐也脫不了干係。
這也就是我一直呼籲同學們要用實踐的方式學程式設計的原因了。程式設計,作為大學中不必有先修課就學的課程,先不必找什麼理論,直接實踐起來就行。
產生「偏理論」或者「偏實踐」念頭的同學,緊跟課程的進度為要。因為你有欠賬,所以得加倍付出努力。緊緊跟住,是因為學資料結構中的實踐,也是程式設計能力提高的方式。一旦遇到突破不了的點,補程式設計中的知識點。
要不要先把c語言學一遍再學資料結構?至少資料結構快考試了,來不及。如果需要,假期時間自己重學一遍c語言是可以的。如果你真能協調好時間,現在做也可以。就現實的情況,以能將實踐做下去為原則,c語言部分則是缺啥補啥更現實。
資料結構 樹 理論
1.已知一棵深度為k的樹中有n1個度為1的結點,n2個度為2的結點,nk個度為k的結點,問該樹中有多少個葉子結點?前提 對任何乙個二叉樹,若齊葉子結點數為n0,度為2的結點數為n2,則n0 n2 1。證明如下 設一顆二叉樹上葉子結點數為n0,單分支結點數為n1,雙分支結點數為n2,則總結點數為 n0...
資料結構實踐專案 排序
本文是 資料結構基礎系列 排序 課程的實踐專案。本文針對 1.排序問題及導學 2.插入排序之直接插入排序 3.插入排序之希爾排序 4.交換排序之氣泡排序 5.交換排序之快速排序 6.選擇排序之直接選擇排序 7.選擇排序之堆排序 8.歸併排序 9.簡單的計數排序 10.基數排序 11.各種排序的比較 ...
資料結構實踐 驗證演算法
檔名稱 main.cpp 完成日期 2015年12月18日 版本號 codeblocks 問題描述 雜湊表及其運算的實現 輸入描述 無 程式輸出 見執行結果 include define maxsize 100 定義最大雜湊表長度 define nullkey 1 定義空關鍵字值 define de...