前幾天收到一個問題,說有下面這樣一道題,問我該怎樣計算,我直接說4x3x2=24。這個問題用數學方法就是非常簡單,就是排列組合的問題;但是要把它轉化為計算機去求解,不知道如何下手。
其實很多人用數學會解決問題,用計算機不會解決,除了多計算機的一些基本規則不了解外,更多其實還是自己無法將自己的想法描述出來,我一直覺得,如果你能用文字或者語言描述清楚問題,那麼你就可以用程式語言去解決。
但是絕大多數時刻,我們其實就是記住了一個公式,如果這裡不能套用公式,可能就不知道如何求解了,這個時候其實回歸定義或者從最笨的方法下手,便於我們從新跳出框架理解問題。
這道題我的思路就是用語言描述就是從ABCD中隨機選取一個字母,有4種可能,剩下的字母繼續有3種可能選擇,最後有2種選擇可能。組合一起就是24種。
轉換成編程,就是編程要如何去實現從4個字母種如何選擇一個字母呢?然後再從剩下的當中繼續選取。可能你又會發現新的問題,如何保證這次選擇的和上次不一樣?如何又可以保證所有的情況都已經找出來了?繼續想可能你會覺得變得很複雜了。
不知道如何下手我們就用最笨的方法,一個個去組合列舉,滿足的就列印,不滿足的就不列印,為了防止漏掉某種情況,我們就按照順序來;
第一個是A,第二個可以BCD;
第二個是B,那第三個可以CD;結果--ABC--ABD
第二個是C,那麼第三個可以BD;結果--ACB--ACD
第二個是D,那麼第三個可以BC;結果--ADB--ADC
上面一輪的所有情況就列舉出來了,一共6種;同理往下推理就是第一個是B,第二個可以是ACD,根據上面的數據結果,其實我們已經可以知道結果就是4x6=24種了。只要按照這個方法下去,每一種情況都可以列舉出來。
一個個元素去列舉出來,這個我們很清楚,用循環就可以了。三個字母我們就用三次循環嵌套,這裡會出現重複的情況,上面人工列舉的時候我們是自動過濾掉重複字母情況的,在編程中,你只要把我們剛才過濾的規則用程式語言描述出來就可以了,就是第一個,第二個,第三個不想等。
求解代碼:
雞兔同籠問題
上面用到的其實就是列舉法或者叫做窮舉法,類似的問題有很多,比如下面比較有名的雞兔同籠的問題:
用數學的方法解:
假設 雞有 x只,兔子有y只,根據關係可以列出下面的等式。
x+y = 35
2x+4y = 94
用編程的方法求解:
這裡使用窮舉法,其實就是一個個去套,假設 雞有1隻,兔子有34隻,結果不滿足;假設 雞有2隻,兔子有33隻,結果不滿足,以此類推,直到情況滿足,得到一個結果,這就是所謂的窮舉法,這裡的情況雖然不多,但是如果人自己一個個去套還是有些麻煩的,如果給計算機去套,還是非常簡單的,只要告訴它規則就可以了,滿足規則輸出結果。
windows下批處理命令bat是如何工作的?
python圖形用戶界面(一):創建第一個GUI圖形用戶界面
python圖像處理-濾鏡處理
python圖像處理-實現驗證碼圖片(上)