学编程必先懂数学?—— 兼论 “函数式编程”(1)
从我还没有留校任教时起,就总是不断有人问我:学编程是不是必须要数学好、数学不好就学不会编程?足可见广大群众对这两个名词的敬畏之心,说不清哪一个更让大家感到恐惧。
而今天刚刚发布的《全民一起玩Python 提高篇》三节课程,相信又会让很多同学再次想到这个问题,因为这三节课程的主题词竟然是:函数、高阶函数、偏函数、匿名函数、lambda运算 ……
那么回到这个问题上,学好编程是不是必须要学好数学呢?个人愚见:是也不是。
说它 “是” ,是因为程序与数学确实是一回事,否则为什么程序的基本构成 —— “变量”、“函数” —— 都是来自于数学呢?而说它 “不是” ,则是因为对于大多数人来说,也许 “此数学” 非 “彼数学” 。或者说:学习编程所依赖的是数学思维,而不是试卷上那些精巧高妙的解题方法。
那么学习编程到底需要怎样的数学思维?最基本的大概就是两个:抽象与逻辑。
所谓抽象,浅显的说就是 “用符号描述问题” 。参照数学教育:我们小学时解应用题,鸡就是鸡、兔就是兔,头就是头、腿就是腿,脑海里构想的就是若干只鸡若干条腿,然后用各种稀奇古怪的方法(比如吹哨抬腿)算出答案。
然而到了初中,第一件事就是要学会怎样用 m n x y 各种字母代替鸡兔头腿。这样就可以把题目里的汉字完全使用字母重新描述一遍,比如 “鸡兔共计15个头、40条腿”,字母复述就是:“x=15 , y = 40 ” ; “每鸡每兔各有一个头,鸡有两腿兔有四腿”,写出来就是:“x=m+n , y = 2m+4n ” 。
而最妙的地方在于:只要能把这些字母句子(也就是方程)都写出来,求解就完全是套路化的操作,不用动脑就能得到答案。
所以小学数学叫《算术》,初中数学叫《代数》。
编程序也是一样。就像上一专题面向对象中举的游戏例子:屏幕上一个个活生生的角色,在程序员看来无非是一个个的变量,也就是代数中那些字母符号。而每个角色都有自己的屏幕位置、生命值、攻击力,就体现为这些变量对象的一个个属性,而这些属性,自然也是变量。如果这些角色之间靠近发生了打斗,体现到程序中,就是对屏幕位置变量进行加减操作、对每个角色的生命值进行加减操作 ……
而最妙的地方在于:只要把这些变量和互动(也就是表达式语句)都写出来,运行就完全是套路化的查找,计算机会自动得到答案。
只不过中学数学叫 “方程”,而计算机里叫 “建模”。
对应到数学,这就是我们在初中《几何》课程各种证明题中,那一串串小圆点(因为/所以)培养出的思维模式。
而更进一步的,则是在完成了初步的抽象建模与逻辑分析之后,不断发掘其中的冗余和弯路,从而一步步优化链条,从而实现 “算法优化” 。
当然,如果你天纵奇才、还能再进一步,对同一个问题提出另一种崭新的抽象方式、并进而可以用更短更精的逻辑链条描述它,那么你就创建了新的算法或编程范式,相当于数学大师提出新的体系方法。不过这已经远远超出大多数专业程序员的需求了。
好了,说了这么多思维方式,到底跟我们今天发布的 “函数式编程初步” 又有什么关系呢?其实道理很明显:函数是
觉得好看就点个在看吧
杨老师课程全集
全民一起玩Python |全民一起VBA
均在网易云课堂发布,欢迎加入、一起进步。
二维码: