北大李晓明教授:从趣味数学到趣味算法到趣味编程——非专业学习者体会计算思维的一条途径?

计算思维谈了十多年了。如果于概念辨析的层面探讨,似乎还没有形成共识的“定义”。事实上,并非任何事情都要先搞清楚定义才能展开内涵研究和实践,许多方向性的话题,本就不好下定义。然而,十多年没搞清楚定义,却还有人愿意继续谈,一定是这个词语后面蕴涵着某种比较广阔的人们觉得有价值的东西。于是,可以重点讨论或者展示些具体的做法和例子。是否属于计算思维的范畴,有些不同的看法也正常,重点是事情具体了,价值就容易判断。

本文提出一种教学思路,面向非计算机专业的学生(这里不一定只是在校生),不追求让他们系统掌握什么,只是希望通过一种过程,让他们感受到“计算思维”的魅力。

这个过程应该是轻松愉快的,否则感受到的就不是“魅力”了;这个过程也应该是有挑战性的,否则感受到的就不是“计算思维的魅力”了。我们姑且把这个过程称为“从趣味数学到趣味算法到趣味编程”,或者短一些,就叫“趣味数算程”。

1从趣味数学说起

为什么起点是“趣味数学问题”而不是什么“生活中的真实问题”?这是另外一个话题了。用生活中的真实问题作为引导,当然也是有价值的。这里可以说的是,用已经抽象好的趣味数学问题作为引导,不仅有价值,而且对初学者来说会相对容易些。

这里,可能有敏感的读者会提问题:“等等,计算思维不是强调抽象吗?用已经抽象好的问题作为出发点,不就丧失了体会‘抽象’的机会?”

我的回答是:“这里只是完成了‘数学抽象’的问题,计算抽象还在后面呢!”

这样一种说法,得益于最近这两年参与讲授一门北大社会学系的课程,对于我讲的那些内容的风格,学生给了一个概括:概念抽象→数学抽象→计算抽象。可以说,这真是教学相长了。我自己先前就没总结出这么漂亮(而且贴切)的说法,只是朴素地凭感觉铺陈那些内容。

为什么以趣味数学为起点?还有一个个人的原因。记得大约是上小学三四年级的时候,不知从哪弄来一本书,叫《趣味数学》,上面有许多有趣的小题目,不是都看得懂,但其中一些内容已足以让人很有兴致,有些题目直到现在都还记得,偶尔会在脑海中蹦出来。当然,那本书后来就不知去向了。

前年某个时候,不知怎么又想起了它,抱着试一试的心态,到一个旧书网,居然淘到了这本1961年少年儿童出版社出的书(如图1所示)。翻一翻,非常亲切。结合最近这几年参与编写基于高中信息技术新课标的教材《算法初步》,意识到许多趣味数学问题(或者说数学游戏)的解,都是一个过程描述(即先做什么,再做什么,然后做什么等),也就是一个“算法”了。不过从讨论“计算机算法”的角度,那些问题有局限性,即它们都很具体,相当于计算机科学中某问题的一个“实例”。

图11961年少年儿童出版社出版的《趣味数学》

于是,一个思路自然浮现出来:从《趣味数学》中的问题出发,将它们一般化,讨论在一般化情形下的解,即计算机算法,最后用程序予以表达,从而形成一条从趣味数学到趣味算法到趣味编程的途径。

2从趣味算法到趣味编程

《趣味数学》中适合的问题有很多,由于篇幅原因,本文仅通过下面这样一个例子展现这条途径的风格,也相信读者能有更多、更好的例子。

《趣味数学》中的一个问题:移棋子。将黑白6只棋子在桌上黑白相间地排成一排——黑白黑白黑白,左边留出够放4只子的空位,现在要把这6只子移成3只白子在左边、3只黑子紧接在右边的样子(如图2所示)。要求是必须一次并列移两子,把它们移到空位上,不能更改子的顺序,只可移3次解决问题。

三年级以上小学生能理解这个问题。想一想,试一试,10分钟内通常就能解决,也就是给出了一个三步骤算法。这里留给读者来做。

但我们不能就此满足。现在3对黑白相间棋子的问题会求解了,那么如果是任意n(n>3)对,是不是也会求解呢?我们需要有一个以n为参数的计算机算法!

怎么做?对熟悉计算机科学的人来说,马上能想到的可以试一试的思路就是“约简”。希望求解关于n的问题,就看能否先解决n-1的问题,然后在那基础上做些“增量性”工作,得到关于n的解。这种思路递归下去,到了n=3,就可用前面提到的办法了。于是,重点就在于“增量性”工作该怎么做。图3(a)展示了一个方案:以3对棋子已经移好了作为初始状态,经过靠拢、交界、到位、凑整、回填5个步骤,完成4对棋子的移动任务。

审视这5个步骤,我们能体会到这种增量性操作具有一般性,也就是在4对已经完成的基础上再用类似的5步,就能完成5对棋子的移动任务等。至此,作为算法描述和理解也就透彻了,的确看到了一个对所有n>3的解决方案。我们实现了一个从特殊(n=3)到一般的升华,从趣味数学到了趣味算法。

那么,若编出程序来,还能带来什么新的价值吗?是的,如果我们心目中的程序是要基于输入n,一步步输出展示一个类似于图3(a)所示的过程(当然还要加上最初3对是怎么完成的),就会有至少两条很有价值的考虑:

首先,信息的表示,即如何在程序中用数据表示棋子局面的状态和变化过程。简单起见,只考虑字符方式。程序的执行,就可能想象输出如图3(b)所示的结果。从学理的角度讲,就是要体现信息和数据的关系,利用编程语言提供的能力,做一个从信息到数据的映射。

再者,这样一个针对n的过程,显然有递归的味道,当然可用递归实现,同时也很容易用迭代来实现,也就促进了对这两种基本方式的理解和运用。图4就是一个完整的程序(迭代方式),图3(b)则是它的一次执行结果。

这种程序本身并不复杂,可一旦实现,带来的却是惊喜,因为它意味着走完了一条有点曲折,但每个弯都能过去且引人入胜的途径。《趣味数学》中的许多例子,都有类似的样式:从算法的角度分析清楚后,最后落实到程序都不需要专业的编程能力。

3结语

如果有进一步的追求,马上可以问的问题是:前面说的这个算法在效率上是最优的吗?如果有n对棋子,现在的做法是需要35×(n-3)次操作。还能否再改进?结论是可以的,但如何能简单描述,则是另一个层面的挑战了。

经常会听到这样的纠结:非计算机专业的学生该不该学编程?如果该学,该如何学?当然,非计算机专业也有不同的情况,这里主要谈传统上认为离得比较远的,如社会科学专业的学生。

我现在认为,他们应该编程,但没必要“学”编程。这里给“学”打上引号,是指那种很正式地选一门计算机语言编程课的方式。那么,不学怎么会呢?答案是“在用中学”!就像一些应用软件,人们都没有“学”,但都在不同程度(不同水平)上用一样。类似于Python这种层次的解释型语言,是可以高效“嵌入到”一些问题求解过程中的。这种过程可能需要抽象、分析、推理,也可能需要写些文字,还可能需要算出几个数,对某些现象进行简单模拟,于是需要写几行代码等。这就是“面向问题求解”,而不是为了编程而编程。本文以数学游戏问题为例,展示了一条途径。不同专业学科自然可以选择各自的问题作为出发点,培养训练这种“融会贯通”的能力。

引文格式:李晓明.从趣味数学到趣味算法到趣味编程——非专业学习者体会计算思维的一条途径?[J].计算机教育,2020(11):优先出版.

THE END
1.《C语言向量运算:点亮人工智能几何计算之路》通过深入理解其数学原理,并巧妙地运用 C 语言实现这些运算,我们能够在人工智能的几何计算世界里游刃有余,推动人工智能技术在更广泛的领域中实现创新与突破,为构建更加智能、高效的人工智能系统奠定坚实的数学与编程基础。https://developer.unity.cn/projects/676039fcedbc2a7bccf0f297
2.算法与数学:编程中的数学之美例如,在图形算法中,我们可以利用几何变换和渲染技术实现精美的视觉效果;在人工智能领域,我们可以利用深度学习等先进技术模拟人类的智能行为。三、数学与编程的融合与创新随着计算机技术的不断发展,数学与编程之间的融合和创新也越来越紧密。一方面,数学为编程提供了更多的理论支持和工具方法;另一方面,编程也为数学的https://baijiahao.baidu.com/s?id=1803291568680234757&wfr=spider&for=pc
3.C语言编程实践:基础算法代码实现资源摘要信息:"C语言学习代码实例 - 21 - 30" 本资源包含一系列C语言编程实例,涵盖了从基础算法到数学问题解决等多个知识点。每个实例都是针对特定的编程问题而设计,旨在帮助学习者通过实践加深对C语言的理解。 1. 插入排序 - 描述了插入排序算法,这是一个基础的排序算法,适用于小型数据集。通过将数组分为已排https://wenku.csdn.net/doc/6dttgdkgun
4.高思AI数学编程,算法替代游戏,有趣又有效!高斯数学基因,算法代替游戏 AI数学编程依托高斯数学体系,将常见的数学问题抽象成数学模型,结合信息学比赛中的考点,总结出适合孩子理解的算法课程。然而市面上大多数的编程机构都是以游戏化的编程为主,课程内容简单且同质化严重,学生很难学习到程序的核心知识,还会https://mp.weixin.qq.com/s?__biz=MzAwNTM0MjUzNw==&mid=2649998778&idx=3&sn=2a4fdb97c14b54a9073231b6ff8d160c&chksm=8319719cb46ef88aea82a5d7276ea036fa71db9c389ad080ba8a568baa60b5253792c0d91c31&scene=27
5.算法工程师要学什么常见问题算法工程师必备七大技能:数据结构和算法编程语言数学基础算法设计与分析分布式系统机器学习和深度学习软件工程实践,助力解决计算机科学和工业中的复杂问题。 算法工程师必修技能 算法工程师是计算机科学领域的专业人员,负责设计、分析和实现高效算法来解决计算问题。要成为一名合格的算法工程师,需要掌握以下核心技能: https://www.php.cn/faq/816502.html
6.编程算法数学之美by的数学原理 24. 输入一个汉字需要敲多少个键:谈谈香农第一定律 25. 从全球导航到输入法:谈谈动态规划 数学之美 0. 网页排名算法 0. 网页排名算法 谈Page Rank –Google 的民主表决式网页排名技术 2006年2月27 日上午08:38:00 大家可能听说过,Google 革命性的发明是它名为“Page Rank” 的网页排名 算法,https://max.book118.com/html/2018/0108/147961282.shtm
7.编程和数学有什么区别?这是一个编程的入门问题,但它就很难称得上是一个数学问题。类似这种问题,我们人类看起来可能很简单、很幼稚,甚至都称不上一个问题,但我们却需要学习如何告诉计算机去完成这项任务。 这里简单介绍一个最简单的排序算法——冒泡法(Bubble Sort),有兴趣的爸妈或者小朋友可以亲身感受一下人和计算机是如何通过编程语言进行http://shaoer.cctv.com/m/a/index.shtml?id=ARTIiBhAaPjbYAQLuiq8b0jg170418
8.28个不得不看的经典编程算法发起人的描述:《来自圣经的证明》收集了数十个简洁而优雅的数学证明,迅速赢得了大批数学爱好者的追捧。如果还有一本《来自圣经的算法》,哪些算法会列入其中呢? ***名:Union-find 严格地说,并查集是一种数据结构,它专门用来处理集合的合并操作和查询操作。并查集巧妙地借用了树结构,使得编程复杂度降低到了令人难以置https://mobile.51cto.com/news-455988.htm
9.C语言编写的数学常用算法C语言编写的数学常用算法 点赞(0) 踩踩(0) 反馈 所需:1 积分 电信网络下载 xiaoweiwb 2013-06-20 00:40:06 评论 应该是某个光盘里的东西harold007007007007 2013-04-04 09:33:34 评论 很好用!!!hu1610552336 2013-03-25 18:05:57 评论 很好玩,编程与数学结合起来。数据https://www.coder100.com/index/index/content/id/1335829
10.编程竞赛宝典C++语言和算法入门相应地,各类以算法为主的编程竞赛也层出不穷:在国内,有全国青少年信息学奥林匹克联赛(National Olympiad in Informatics in Provinces,NOIP),该联赛与全国中学生生物学联赛、全国中学生物理竞赛、全国高中数学联赛、全国高中学生化学竞赛并称为国内影响力最大的“五大奥赛”;在国际上,有面向中学生的国际信息学奥林匹克https://www.epubit.com/bookDetails?id=UB77a9ce8133887
11.排盘原理[编程算法] 黄色格子是每个格子的坐标,用(当前年数-1984)/10,得到的除数为纵坐标,余数为横坐标,找到交叉点即可. 比如(2020-1984)/10得到3余6 竖着找黄格子为3是甲午,再横着数到标着6的格子,所以2020年是庚子年. 年柱,即人出生的年份用干支来表示。注意:上一年和下一年的分界线是以立春这一天的交节时刻https://www.jianshu.com/p/1182feb70735
12.GitHubLLC专家编程提取码: peu2 C语言解惑(中文版)提取码: sk0m C语言游戏编程从入门到精通提取码: f3ho C语言科学与艺术提取码: kmug C语言高级实用编程技巧提取码: 1708 C和C++代码精粹提取码: 5jv5 C数学算法提取码: 1804 C语言程序开发范例宝典提取码: mb15 https://github.com/LL-GG/pdf/
13.用Java编程绘制心形图案,探索代码与爱意的完美融合用Java编程绘制心形图案,不仅仅是实现一个数学曲线的过程,更是将抽象的情感通过有形的图形呈现出来。编程语言,特别是Java,通过其强大的图形绘制能力,成为了将这种情感符号具象化的理想工具。通过简单的数学算法与图形编程,开发者可以用代码创造出富有视觉冲击力和情感表达的心形图案,达到艺术与技术的完美融合。https://www.zhishiku.com/post/182185.html
14.编程的32个算法澄心元素5.Buchberger算法——一种数学算法,可将其视为针对单变量最大公约数求解的欧几里得算法和线性系统中高斯消元法的泛化。 In computational algebraic geometry and computational commutative algebra, Buchberger's algorithm is a method of transforming a given set of generators for a polynomial ideal into a Gr?bhttps://www.cnblogs.com/cxys85/p/10052476.html