在fedora的郵件列表中,見到這樣的乙個問題:
有2n個人去買票,票價是50,n個人手上有50塊錢,n個人有100塊錢,售票員手上沒有零錢.問這2n個人有多少種排隊方法.
當輸入乙個n時,輸出排列數.n<=20.
這裡的排列數,到底是要輸出所有的可能,還是要把每乙個可能都輸出呢?
還有就是,100的n個人和50的n個人之間是不是有差別的(即,是不是需要組合.)
問題來了.
為何很多人宣稱學不好數學就當不好程式設計師呢?
因為他們狹隘的認為程式==演算法
而他們又狹隘的認為演算法==數學。
只因為他們遇到的演算法題目都是數學題。
實際上呢?
實際上上,數學題(如果非要用計算機去解決的話)通常都是由專業的數學軟體去解決的 ....
而軟體工程,則事實上不需要多少數學知識,他更多的是需要廣闊的知識面,對各種實際軟體硬體的深刻理解。
拿數學題目去當習題練習程式設計,本身就是錯誤的。
好了,批判完這個,我們開始解決手頭的數學題好了。
其實方法很簡單,就是保證售票員手裡總是有餘錢就可以了。
只要手裡拿 50票子的人總是在拿100票子的人之前付款,這樣的排隊方式就是可以的。
首先我們把這類人排兩隊。 那麼每乙個隊伍的排隊方法是 a(n)(n) 種。
那麼,典型的就是 n 個 50票子的人和 n 個 100 票子的人交錯排隊,保證拿50的在前就可以了
那麼可能的情況就是 a(n)(n) * a(n)(n) . 分別是 兩隊 n 個人員的完全排列再對這2個完全排列的進行組合。
但是,這還只是其中的一種情況。
事實上, 這2隊人可以任意穿插,只要在穿插的時候,保證 50 票子那隊的人先行排隊。
這樣算出來排列的可能性就可以用乙個公式表達出來了。 誒,已經沒學數學了,都不知道接下來怎麼排了。囧,請知道的人趕緊站出來指點一下。
反正,只要乙個公式折騰出來就可以了,程式也就是乙個簡單的計算過程,按按計算器就可以了。
= =我說到,公式出來了,按按計算器就可以了,我是這麼說的麼? 呵呵。
所以啊,解決數學問題不是程式設計師的事情,編寫好用的計算器軟體才是。
國內的教育都在誤導程式設計師去做數學家。
而編寫計算器軟體,則更多的是藝術~~~~~~ 而不是數學。
so, knuth 說, 電腦科學首先藝術。
電腦科學
電腦科學就是研究計算 如何表示和處理資訊。解決問題 你將學會各種演算法策略,比如分而治之法 遞迴 探索法 貪婪搜尋和隨機演算法,它們可以幫你分解和解決任何一種問題。邏輯 你開始使用更準確和正式的方式進行思考,比如抽象 布林邏輯 數字理論和集合理論,你因此能夠以一種嚴謹的方式來解決問題。資料 你接觸到...
計算機與電腦科學初識
1.為何要學習計算機與計算科學?這是乙個智慧型化與資料化的時代,計算解決自然社會問題,已經成為這個資料時代的基本需求了。而計算機自動化高效處理大量問題這種機器計算也已成為一種常態,為實現機器更好的自動計算,計算科學這門藝術便誕生了。計算科學從一種思維高度來決定我們對於計算的認知,讓我們更好把握計算的...
這是電腦科學
演算法對於計算機的發明和發展,真的是.太重要了。我們永遠都不會忘記,是數學家們的不斷努力,才將計算機的構想變為現實。而計算機也是通過數學 邏輯 運算,幫助人們解決現實問題的。所以能把演算法搞到noi和icpc金銀牌的程度,了不起哉 前途光明哉 但是,也應該看到,電腦科學並不是僅僅有演算法,非演算法的...