計算機科學首先藝術


自己曾在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 票子那隊的人先行排隊。這樣算出來排列的可能性就可以用一個公式表達出來了。

反正,只要一個公式折騰出來就可以了,程序也就是一個簡單的計算過程,按按計算器就可以了。

我說到,公式出來了,按按計算器就可以了,我是這麽說的麽? 呵呵。

所以啊,解決數學問題不是程序員的事情,編寫好用的計算器軟件才是。

國內的教育都在誤導程序員去做數學家。

而編寫計算器軟件,則更多的是藝術~~ 并不是數學。

所以 Knuth 說,計算機科學首先藝術。