计算机科学首先艺术

时间:2021-01-06 06:49:15

在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 说, 计算机科学首先艺术。