寫不出程序是不是演算法能力差?

最近看了MIT的Python公開課,導師講的也很明白,英語也不是障礙。一路學習下來,因為之前接觸過其他語言的『前兩章』,都是類似結構,即數據類型和循環。

感覺數據類型略微抽象,但是還好,if,while 這些循環就更好理解了。

然後導師講到求算一個數的奇偶,我暫停了下來,自己想來想去沒找到方法。接著看視頻,看到很簡單的答案 /2*2== 原數的 if 循環來判定。

更別提什麼平方根的計算了……

我的意思是,讓我自己想,想不出這個邏輯過程,但是看答案又看得懂。數學能力從小學到高中是比較好的,大學的微分比較朦朧,線性代數完全不知道在說啥……據說國外的Kids們都是用線性代數來做題,因為這『更簡單』!

我到底是缺乏系統的訓練,還是說少點什麼思維能力?這種能力是演算法嗎?


從提問的語氣來看,題主似乎有點懷疑自己能力的味道。其實這大可不必。個人覺得導致題主想不出解題思路的原因是,題主還不熟悉從設計程序的角度去思考問題。而這可能是由多種原因導致的,比如對編程語言不熟悉,你也許還不知道有%,或者即便知道,但還不能在遇到問題的時候馬上聯想到可以用諸如這樣的方法去解決。

換個角度來想這個問題,假如這只是道普通的數學題:如何判斷給定的正整數x,是否是偶數?題主可能立馬會想到:看它能不能被2整除嘛!題主能立刻想到,是因為對類似的數學概念已經再熟悉不過了。然後,題主可能會做個簡單的除法,結果為整數,那x就是偶數,結果為小數,那x就是奇數。或者做個短除法,看是否有餘數,無則偶數,有則奇數。

但是,如何編程來實現呢?你可能會猶豫一下,因為你還無法立刻將類似的數學過程,轉化為程序語言來描述。熟悉%運算的小夥伴馬上會想到,x%2 不就相當於做了短除法嘛?

在編程解決真實世界的問題時,本質上就是在做這種轉換。諸如這種簡單的數學運算,或是簡單的邏輯推導,當你熟悉了一門編程語言的運算符、if/else/while/for等等語句塊之後,就不會覺得這是什麼難事了。當然更多的問題,不是簡單的幾步計算,或者簡單的幾個if/else就能解決的,它們可能就需要更高級的結構來組織數據、維護數據間的關係,以及更有效的方案來處理這些數據,而這就是數據結構和演算法。

演算法並非是你想的那樣,用來做純粹的數學計算的。而是一種程序設計的策略和思想。雖然數據結構和演算法是開發者的基本功,但正如樓上幾位答主提到的,不必操之過急的去學習那些內容。先把語言基礎打好,先掌握一們工具、建立起一些編程的基本思維。就像是學習武功,先從招式開始。日後恰當的時候再去學習數據結構和演算法,修鍊自己的內功。

不妨嘗試一下答主 Moxos Yuri 提到的方法,先試著用思考常規問題的方式,在紙上畫一畫,而後再考慮如何轉化為用程序去解決。


瀉藥(謝邀):

還記得3年多以前,我第一次學編程課,當時用的C語言,也是遇到了寫一個判斷奇偶數的程序。

當時也是摸不著頭腦,不知道怎麼寫判斷奇偶數的程序。當時的思路就是,判斷能不能被2整除,就可以解出了,但是當時剛學編程第一課,還不知道有 %取模運算,或者老師提過沒注意聽,後來在室友 (一個計算機競賽保送的預科生)的幫助下寫出了這道題。

以後便知道有 %取模了,所以以後寫判斷奇偶數,熟練地寫下 if(i%2 == 0)

我想說的是,編程的許多演算法、方法還是需要來慢慢積累。

我相信樓主的數學不差,至少大腦里肯定知道如何判斷奇偶數,關鍵是將數學知識轉化為代碼的能力需要提高,這個能力是要靠反覆的編程練習以及紮實的演算法基礎做鋪墊的。而要提高這方面的能力,要多找機會練習編程。

練習編程,樓主可以在china mooc上找些題目,http://pat.zju.edu.cn 這個網站也很好,各個難度級別的題都有,樓主剛開始學,那麼可以找簡單的題目多練練。在編程能力提升之後,便是要提升演算法水平的時候了。

當你積累的東西多了,你會發現,寫代碼就是信手拈來,比如求奇偶的方法

i%2

i/2*2

i&>&>1&<&<1

諸如此類

...

現在再回想起當初學習編程的經歷,寫代碼時候的絞盡腦汁,那些看了別人代碼之後的恍然大悟,總還是歷歷在目,不過,一路走來,多積累,多學習,你的代碼也會越來越牛。

我想,從今天起,當有人問起樓主,怎麼判斷一個奇偶數的時候,樓主肯定也會不假思索的給出答案了,那麼恭喜你,你已經邁出了成為一個成功碼農的第一步。


我記得我大一剛學編程的時候,看一個二重循環看了半節課,後來終於看懂了。

其實就是因為剛入門,思維沒習慣。


1、經驗問題,多寫多看多思考,時間久了就會了。

判斷偶數,初學者想不到答案還是很正常的, /2*2== 原數,我就沒用過這種方法,一般用%求模運算符或運算符 A0x1 == 0,這個是經驗。

2、思維方式問題

我不清楚題主當時思考問題時的思路,我認為應該這樣:一個數非奇即偶,奇偶之間的本質區別即是否能被2整除,這要用到%運算符,初學編程的人都沒怎麼接觸過%這個運算符,所以想不出也屬於正常情況,這個就是經驗問題,代碼看多了就知道%就是這麼用的,進一步思考,奇數和偶數是挨著的,從2進位上來看,就是最低位是0還是1,發散一下能否被4,8,16,32整除你也就知道怎麼做了。

根本還是經驗問題,看的代碼少,看代碼時要思考為什麼這麼寫,好處是什麼,可以適當發散下思維,舉一反三,是否有更優的辦法,也可以分析下演算法的優劣,看多了寫多了思維方式就形成了。

另外,數學好和編程能力的高低有一定關係,但不是決定性的,尤其對於初學者,新手接觸不了太複雜的項目,邏輯思維能力才是最重要的,解決一個項目中的實際問題,最重要的是將問題分析透徹,將如何實現的邏輯想明白,剩下的就是轉化成代碼,最後一步做不好就是編程能力差,就是題主所遇到的情況,判斷奇偶是最基本的邏輯問題,編碼能力是可以練的,多看加多寫,多思考。做演算法相關的工作還是要點數學功底。


你這是積累太少了。

我給你一列無序數組,讓你求出其中的中位數。

如果你一行sort之後取中間值給我,這要麼是大學新生,要麼是工業界老手。

如果你告訴我通過分治去遞歸查找中位數,這是演算法好。

如果你證明給我看這個方法是O(N)線性的時間複雜度,這是數學好。


當習慣if(x%2==1)的我,看到if(x0x01)的時候,感受到的就是一個詞「nice」,希望你也有這種感覺,那學起來就容易了


主要是你以前學習的數學的方式,叫模式識別,你大腦裡面其實是先尋找類似的模式,然後按這個模式的公式去求解。如果發現不存在的模式,或者拆分不了模式,就是這個題目解不出來了。

計算機大部分是簡單的邏輯組合,你需要知道一些簡單的邏輯,然後自己去組合使用。就是知道一些簡單的函數去演繹。例如,你知道10個函數,你要想辦法去組合解決複雜的公司。國內學校教學的因素讓你不習慣用這種思維去考慮,習慣了就好


這個,大體上是因為經驗不足,編程完全還沒有入門,跟演算法還有很遠的距離

慢慢來,多看看、寫寫代碼就好了


新手寫不出來程序很正常,不是演算法能力問題,而是編程基礎能力差。找題目或網站打基礎,繼續練,九淺一深。寫不出來就谷歌常式,看懂之後拋開常式,自己頭腦中構思實現過程(無法想像,就在紙筆上實現),再編程實現。基礎code超過1000小時,再去考慮演算法能力


很贊同@ xy beng 的答案,題主只是不熟悉把頭腦中能夠做得東西轉換成程序而已。

之前我寫ZigZag掃描的時候也試過不會轉換。ZigZag就是把一個二維數組按"Z"形掃描,把掃描過的元素存到一個一維數組裡。

開始時,我把開頭十幾個掃描的數組的下標(或者說是,二維矩陣的坐標)寫下來,想用歸納法做,但是把2*2,3*3,4*4的數組弄下來後,才發現下標的規律很模糊,我沒法用一個數學公式或幾個邏輯判斷來實現。

後來,就想,我的大腦是怎麼知道掃描的順序的呢?也就是我的大腦知道怎麼算的,只是如何用程序語言表達。我的大腦就想像一隻類似螞蟻的東西,在二維數組上爬,它只會上下左右爬,所以我就定義幾個常量,接著判斷當前的方向來做出下一步變化,結果用4個判斷就做出來了~

就是這樣,把你大腦知道的答案用編程語言寫下來就好,當然,大腦里沒理解的東西就別想了,真的寫不出來的。。


無他 唯手熟爾


熟讀唐詩三百首,不會作詩也會吟 。

無他,唯手熟而。


解數學題套公式,必須要熟悉大量的公式和變形之後才能在看到問題的時候反應出來應該用什麼。

編程也是一樣,無他唯手熟耳。

演算法?先學會熟練寫代碼再說演算法吧。演算法是普通代碼邏輯的高級組織方法。


思路沒跟上,腦子裡要想像出程序運行的過程。

可以把每一步執行的結果(也就是變數的變化)寫在紙上慢慢體會。


這是太懶不想撕烤的結果吧喵~

計算機的邏輯都是拼湊起來的喵~這比很多其它結構簡單在物理的很多特性被抽象了喵~所以,只要數學就夠了喵…

另外,高中數學好沒任何代表意義,線性代數都沒有喵…集合論也是初步喵…

(人家小學都想得到喵~)


多寫多看就ok了


這個就像一個六年級的學生問老師,我為什麼寫不出《平凡的世界》?


光這個還談不上演算法吧。


這個還沒到談論演算法的程度。


孩子 回頭是岸

編程是要靠天賦的

我能說我是學編程的大四學生嗎

已經轉投運營

祝好運,


推薦閱讀:

有哪些厲害的女程序員的github?
大學要不要練ACM?
北大的軟體與微電子學院適合什麼類型的學生?
軟體測試的工資高還是開發者工資高?
在外行人眼裡程序員是一個怎樣的群體?

TAG:程序員 | Python | 演算法 | 編程 | 邏輯 |