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

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

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

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

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.算法工程师研究生学什么专业随着人工智能技术的不断发展,算法工程师也需要掌握人工智能和机器学习相关的理论和算法。因此,选择人工智能或机器学习专业也是一个不错的选择。 其他相关工程专业 除了上述专业外,还有一些相关工程专业也适合算法工程师,如软件工程、电子工程、信息工程等。这些专业也涉及到算法设计和分析,可以为算法工程师提供更广泛的知http://m.boenyk.com/gaokaozixun/34350.html
2.计算及应用专业好(数学与应用数学和数据计算及应用哪个专业大家好,关于数学与应用数学专业好还是数据计算及应用专业好很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于数学类中的数学与应用数学、信息与计算科学、统计学,哪个专业好发展方向怎样的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助。https://wz.93ta.com/newsView/ACm2GfdWvv9jWo4c0_5045/
3.python哪个专业要学?Worktile社区3. 人工智能:随着人工智能的快速发展,学习Python编程对人工智能专业非常重要。Python在机器学习和深度学习领域有广泛的应用,有许多针对人工智能的库和框架,如TensorFlow和PyTorch。通过学习Python编程,人工智能专业的学生可以更好地开发和实施人工智能算法,并应用到各种实际场景中。 https://worktile.com/kb/ask/89323.html
4.算法工程师是学什么专业出身的?问答计算机科学、数学、统计学、数据科学、人工智能、机器学习、软件工程等相关领域 https://developer.aliyun.com/ask/125334
5.统计学和计算机专业哪个好?附就业前景对比而计算机专业的缺点在于: 1. 学习压力大:计算机专业需要学生具有专业的编程和算法能力,学习内容较多,学习压力也较大。 2. 行业竞争激烈:随着计算机专业就业需求的增加,竞争也变得更加激烈,需要不断提高自己的技能和水平。 综上所述,统计学和计算机专业都有其独特的优势和劣势。从专业学习难度来看,统计学对数学要求较https://www.gk100.com/read_9080238192.htm
6.2021年度软件中心支持服务(机器学习算法及专业模型应用)项目”公中国银行软件中心“2020-2021年度软件中心支持服务(机器学习算法及专业模型应用)项目”公开邀请公告。https://www.boc.cn/aboutboc/bi6/202007/t20200703_18086660.html
7.人工智能未来职业规划书范文(精选10篇)因此,提高专业技术含量,是未来职业稳定和发展的重要途径。不过,在提高技术能力的同时,也要留意行业或职业的发展讯息,注重新知识的学习。一般产业升级并不意味着旧的完全淘汰。例如汽车代替马车,但毕竟都是在公路上行驶,因此车轮,车身等很多部件的制作标准还是一致的。所以旧产业职工只要能及时更新知识结构,依然能在新https://www.ruiwen.com/zhiyeguihua/6557663.html
8.转:2024年展望:未来十大最吃香最具前景专业分析人工智能(AI)和机器学习正在各个行业广泛应用,这个领域的专业人才将在未来几十年内持续需求旺盛。随着技术的快速发展,AI正在重塑我们的生活、工作和社会互动方式。 主要研究方向 1.1 深度学习算法研究 神经网络架构优化:开发更高效、更强大的神经网络模型。 https://maimai.cn/article/detail?fid=1851243312&efid=XSQx0hfK7u4CsISU06jfRw
9.CSDNCSDN是全球知名中文IT技术交流平台,创建于1999年,包含原创博客、精品问答、职业培训、技术论坛、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区.https://www.csdn.net/
10.数据挖掘专业就业方向补齐了这些知识之后,第一件事就是了解大数据生态,Hadoop生态圈,Spark生态圈,机器学习,深度学习(后两者需要高等数学和线性代数基础,如果你的大学专业学这些不要混)。 数据挖掘专业就业方向2 A:做科研(在高校、科研单位以及大型企业,主要研究算法、应用等) https://www.yjbys.com/qiuzhizhinan/show-571958.html
11.《2020科技趋势报告》:AI和中国,成为未来科技世界关键词这项功能对专业摄影师以及所有想拍出更好自拍的人都有实际的应用。图像完成也是执法和军事情报人员的一个有用工具,计算机现在可以帮助他们识别谁或什么是在框架中。考虑到我们已经在机器学习算法和数据集上看到的偏见,图像完成可能成为未来关于隐私和我们设备的争论的一部分。https://www.tmtpost.com/4274113.html