初學者寫程序

前幾天,一個學生問我,看着程序題的答案明白,但是自己寫不出來怎麼辦。其實,即使不僅僅是寫程序,我們在學習很多科目時,都會遭遇這樣的問題。例如,我們要寫一篇“家鄉”的作文,不知如何開展,然後我們去看“範文”,也看得很愉快,但是脫離範文,發現自己寫依然沒有太多頭緒。數學中也會有這樣的情形,我們不會做一道題,然後看了答案,儘管看答案時內心如明鏡,但是自己把答案寫出來依然困難。當能回憶起如此總總,你會發現,這並不是寫程序會遇到的問題,而是學習中常見的問題。這種情形一般是因爲該類問題需要較多的步驟,即使我們學習了相應的基礎知識,也無法短時間就具備能夠調動解題步驟的每一個需要的知識點。人腦並不善於一口氣解決一個複雜的問題。因此我們通常需要尋找突破口。找到突破口,我們就能夠把問題簡化,而簡化的過程,也正是把未知的問題變成已知問題的過程。

這位學生問的問題並不是複雜的問題。她的問題是,“刪去順序表中最小的元素,並以最後一個元素代替”。當然,這可能對初學者而言已經是複雜的問題了。在我們學習順序表的基本操作時,刪除是一定會學習的操作。但我們通常學習的是刪除某個固定位置上的元素或者值爲key的某元素。不管我們是否記得刪除的具體細節,但我們只要還對刪除操作有印象,就容易想到要用到刪除操作的知識。而在刪除之前呢,由於我們並不事先知道哪一個元素是最小的,因此我們需要遍歷查找最小的元素。所以,這個問題實質上就變爲兩個熟悉的問題,就是查找一個元素並刪除它。其實到此,原問題已經被拆分了。我試着告訴學生,如果你認爲自己當前暫不具備寫出完整代碼的能力,那就嘗試解決這兩個子問題。而且,在解決子問題時,只寫出最核心的步驟,而不是考慮所有的細節。我們可以先看查找過程。她不知道應該定義幾個變量,這倒也不奇怪。既然是確定要找最小的元素,是不是需要一個變量來標記最小元素的位置,才能夠做刪除操作。學生一下子能明白,由於最小元素是未知的,因此需要一個變量。到此,她就大概能寫出查找的代碼了。至於刪除,大多數人都知道元素要移動這一點。但對於初學者而言,他並不是不知道元素要移動,而是不能記憶起如何移動,從哪裏開始移動,邊界值是什麼。換句話說,在他們腦海裏,精確記憶的細節早已經忘記,深怕寫出來的代碼錯過了一個特例的運行。而這種擔心是沒有必要的。細節不是不重要,但首先重要的是主體。主體反映問題的本質。其實移動的過程就是a[j] = a[j+1],除此之外,還應該注意什麼呢。從哪兒開始移動是不是也是一個問題呢?是不是從要刪除的元素的後一個位置開始移動。之所以這樣移動,是因爲每次覆蓋的位置上的值已經不需要了。只要掌握了這兩點,刪除的核心代碼是一定能寫出來的。

在學習解決複雜問題時,都可以採用這種拆解問題的思路。那麼我們就可以將複雜的問題變爲相對簡單的問題。只要我們拆解出來的簡單問題我們能夠解決,那麼對應的複雜問題就迎刃而解了。

發佈了57 篇原創文章 · 獲贊 32 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章