盛 格 塾
——
GEDU
Technology
学习编程的
“副作用”
最近我收到一位学员妈妈发给我的微信,是这样的:
这个真的有点出乎我的意料,但仔细一想,又觉得在情理之中。编程和数学,本来就是密不可分的。首先,计算机科学的源头和核心是数学,编程也可看作是数学理论的一种应用,所以很多在大学里学 “应用数学” 专业的同学毕业后做编程工作很是得心应手。STL之父亚历山大·斯特潘诺夫(Alex Stepanov)就是一位杰出的数学家。
反过来,通过练习编程也能促进对数学知识的吸收,提高大家解决数学问题的能力。我们在编程的时候,首先要理解题意,然后根据题意决定要使用的算法,这跟数学中做应用题的思路是一致的。通过不断的练习编程,就能提高大家分析问题和解决问题的能力。
养成严谨的习惯 ▼
编程要求大家养成严谨的习惯,比如,每行代码后面都要加分号,变量名要区分大小写,整数除以0的话会导致程序的崩溃,这些细枝末节看似微不足道,但是要求大家认真对待, 不可以随随便便,想怎么写就怎么写。这种严谨的习惯,无疑对大家解决数学问题是大有帮助的。
提高抽象思维和想象能力 ▼
编程提高了大家抽象思维和想象的能力。比如:
给你一个数 452,要求说出它的百位数、十位数和个位数。
这个几乎是能脱口而出的,对于一个具体的数,要说出它的各个位的数,是不用考虑的,一个小学一年级的孩子也能立马说出来,因为这个根本不用去算,一眼就看出来了。但是,如果要编写一段程序,要求:
让用户输入一个数,然后输出这个数的百位数、十位数和个位数。
这个就很难了,因为现在不知道这个数具体是多少,是没法“看”出来的,是需要“算”出来的。怎么算呢?很多孩子肯定是不会的。即便我们已经先讲解了除法和求余运算,即便你告诉他把一个整数除以100再求10的余数就能得到百位数,他还是不理解为什么。这个就需要有高度的想象能力。现在没有一个具体的数,那么你就要在脑中想象一个数,然后把这个数除以100再求10的余数,看看是不是就得到了百位数。求十位数和个位数的方法也是一样的。
为什么编程需要高度的想象力?因为编程跟数学的一个根本的不同点在于,在大多数情况下数学是对一些确定的数进行计算,而编程是在对“变量“进行计算。变量说得简单一点就是一堆符号,这些符号只有到了运行的时候,才会赋以具体的数,在编写代码的阶段是不知道他们的数值的。这就有点像推导一元二次方程的根,绝大部分同学只能记住最后的结果,但是整个推导的过程是不会的。而编程有点像推导的过程,对着一堆符号在计算。所以如果你学会了编程,那一定具备高度的想象力和抽象思维的能力,一定能够自己推导出一元二次方程的根,包括很多的公式和推论,都能自己推导出来,这样你的数学成绩不提高也难啊。
提高总结和举一反三的能力 ▼
编程也提高了大家的总结能力和举一反三的能力,这个当然需要好的老师帮助大家总结。我们不妨来看几个和分解位数有关的例子。
把一个二位的正整数 n的十位数和个位数分解出来,怎么分解?
解法是 n/10 和 n%10,这个是刚刚提到过的。
怎么把n分钟转换成小时和剩余的分钟呢?
解法是 n/60 和 n%60。
怎么把n个小时转成天和剩余的小时呢?
解法是 n/24 和 n%24。
一共有n元钱,一本书是13元,那么能买几本,还剩几元钱呢?
解法是 n/13 和 n%13。
好,一般的同学(或者老师)可能就此打住了。但是,如果你去看这些解法,有没有发现什么共性呢?是不是都是这样的形式 n/a 和 n%a,只是 a 的值不同呢?这些题目的背后隐藏了什么样数学规律?其实这就是进制在起作用。数的写法采用的一般是十进制,所以十位数和个位数就是 n/10 和 n%10(这里仅限2位数);分钟和小时是60进制,所以分钟转小时和剩余的分钟,就是 n/60 和 n%60;小时和天是24进制,所以小时转成天和剩余的小时,就是n/24 和 n%24;最后一个买书的问题,其实就可以看成是把一个数转成13进制的数的问题,那么就是n/13 和 n%13。这样我们对进制是不是有了更深的理解?如果我们编程能学到这个份上,还愁我们的数学学不好吗?
还有一个很好的例子。有一道题目是:
今天是星期 x,n天后是星期几(约定星期天叫星期7)?
详细的推导过程这里就不叙述了,稍微有点复杂,这里仅给出答案,为 (x-1+n)%7+1。然后我们有另一道题目,是凯撒加密问题:
把一个字母 x(仅考虑小字字母)向后循环平移n位后得到的字母是什么(这里循环平移的意思是,过了 z 后再回到 a)?
这两道题目看似风牛马不相及,而且很多同学一看到数据加密,马上就望而却步了,认为一定很难。但仔细分析一下,其实本质上是一样的,两个都是循环平移。在星期中,1是第一个值,周期是 7,在小写字母表中,‘a’是第一个值,周期为26, 所以答案就是 (x-‘a’+n)%26+’a’。如果不找到他们的共性,而自己去思考,的确会比较难。这些题目本质上都是数学问题,因而这些代码会写了,也就理解了相应的数学知识。
提高创新能力 ▼
编程还提高了大家的创新能力。编程是一门艺术,是一个从无到有的过程。代码既有一定的规范,同时又有很高的灵活性,这就导致每一个题目都有很多种不同的解法。例如:
如何显示出一个3位数的倒过来的数(即如果用户输入346,输出643)?
正规的解法是把这个3位数的百位数、十位数和个位数分拆开来(用前面提到的方法),然后再重新组合成一个新的数,然后显示出来。这个代码怎么写也需要4~5行吧(不包括变量申明、return 语句以及空行),但是有同学给出了一个很巧妙的解法,直接以字符形式把三位数读到3个变量里,然后把3个变量倒着输出(不加空格),核心代码就2行。你能说这不是一种创新吗?把这种创新能力用到求解数学题目里,许多题目将会迎刃而解。
巩固数学知识 ▼
最后一点,编程可以帮助我们巩固数学知识。比如:
[m, n] 包含几个整数?
很多同学搞不清楚,认为有 n-m 个,但是编个代码算一算,就发现其实有n-m+1个数。还有就是:
求余运算%是个什么东西?
求余运算在数学中是不常用到的,因而大多数同学对它不熟悉。但是在编程里却经常用到,代码写得多了,对这个运算就很熟悉了。
总之,学会编程,对提高数学成绩是大有裨益的。这个“副作用”绝对不是个案,而是有科学依据的。而且这个“副作用”是人见人爱、求之不得的,所以学习编程,何乐而不为呢?
-END-
【盛格塾】
正心诚意,格物致知
以人文情怀审视软件,以软件技术改变人生
格友公众号
盛格塾小程序
扫描上方二维码或在微信中搜索 “盛格塾” 小程序
可以阅读更多文章和有声读物
往期推荐