当前位置: 首页 > news >正文

​卜东波研究员:高观点下的少儿计算思维

f6f7eb079fdd3aa00ae8567b33b866aa.gif

2018年的一天,我给同事包云岗打了个电话,说:“孩子们上二年级了,能否在轻松、活泼的氛围下,引导孩子们学一些数学思维呢?”云岗很赞同,我们就一起组织了一个小SIGMA数学特别兴趣组,权且由包云岗、兰艳艳和我担任老师,学员就是我们自己的孩子。

在这个特别兴趣组中,学生用书是通用的奥数教材,不过教师用书可不太普通—我们用的是G. Polya写的《怎样解题—数学思维的新方法》(How To Solve it)和陶哲轩写的《陶哲轩教你学数学》。换句话说,我们践行的是Polya的数学教育观—重在倾听孩子们的理解和猜想,重在引导孩子们观察、尝试、联想、归纳、做“合情推理”,总之是一种“慢数学”的风格,有时候我们甚至2个小时只讲一道题。

一开始的确看不出成效,但等到三年下来,才慢慢发现孩子们有了一些进步—当然,这些进步不是指孩子们参加某个杯赛拿了个奖,而是指孩子们掌握了一些基本的数学思维,体现在自己能够提出和证明一些猜想,比如包若宁、卜文远、魏文珊小朋友提出了三阶幻方的“包卜魏猜想”,傅鼎荃小朋友在学习“鸡兔同笼”问题时,完全自主地想出了“二分法”。在思维火花迸发的尤里卡时刻,孩子们兴奋得又喊又跳;躬逢其时,我们也非常欣慰—这是对教师最大的肯定和褒奖。

等到了2020年春节,因为出现疫情,孩子们都憋在家里,很是无聊,就嚷嚷着让我们教他们编程。教一门编程语言容易,但是关键不在这里,而在于教“计算思维”,这给我们出了一个不小的难题。

事实上,包云岗、兰艳艳和我都在中国科学院大学教计算机科学与技术:包老师讲授“操作系统”,负责“一生一芯”实践计划,讲解如何设计CPU和计算机系统;兰老师讲授“机器学习和人工智能”,训练计算机怎样学习;我讲授“计算机算法设计”,包括怎样观察问题和求解问题。简而言之,我们教的都是“计算思维”。

不过我们面向的都是本科生和研究生,能否教小学生计算思维?教什么?怎么教?这对我们来说是全新的挑战。这可不像教数学,还有Polya和陶哲轩写的书能够当作教材,给我们一些指导。

我们在开课前思考了很久,教的时候又边教边琢磨,把教授本科生、研究生的计算思维进行裁剪和修改,形成了一个初步的“小学生版”计算思维。

所谓计算思维,其核心是碰到问题时如何观察、如何尝试,然后如何根据观察到的规律设计计算机程序来求解问题。下面这几条或许是最基本的计算思维:

(1)先正向尝试理解题意,再反向求解问题

碰到一个问题如何下手?孩子们往往会对着问题发呆,感觉束手无策。这不怪孩子们,求解问题是“反向思维”,有时候的确不太容易一下子就想出来。

在这种情况下,“先正向尝试理解题意,再反向求解问题”是走出困境的一个好办法。以“鸡兔同笼”问题为例,可以先尝试一下“鸡有0只”,即使这个尝试非常粗糙也没关系,然后验证这个尝试对不对,不对再修改尝试,比如接着尝试“有1只鸡对不对”,如果不对再增加鸡的数目。

145b9b90ba15175be55865d22b098429.png

先尝试猜测一个解(或许这个解很粗糙,这不要紧),再验证这个猜测是否满足要求,不满足要求就修改;这种“尝试-验证-改进”策略是“试错法”,也是“逐步改进法”。正向尝试有助于理解题意,或许应该成为孩子们碰到问题时的“第一反应”。

这种策略看起来很笨,不过却有三个好处:一是能够使孩子们动起手来,避免发呆;二是能够启发我们写一个求解的程序;第三点更重要,孩子们尝试不了几次,可能就会自己发现规律,想出更好的求解方法—这不是想象或夸张,SIGMA的孩子们就是这样想出求解方法的。

说得更远一点儿,计算机科学与技术里普遍采用这种“用正向尝试来反向解题”的策略。一个典型的方法就是神经网络的训练过程—尝试设置网络参数,做正向的网络传播,验证传播的结果,如果不好就修正网络参数,最终反向求解出网络参数。

(2)从最简单的做起

碰到一个复杂的问题怎么办?比如“四个和尚分馍馍”问题,唐僧师徒4人化缘化到了10个馍馍,问共有几种分法?孩子们没学过组合数学,看到这么多和尚和这么多馍馍,一下就傻眼了。

02cf122854140ec2ab6b3444e9cf477e.png

直接求解这个问题是很难的,我们就启发孩子们从最简单的做起:4个和尚、10个馍馍的问题不会解,那就先考虑2个和尚、1个馍馍的问题。反过来,如果最简单的情形都无法解决,那就说明这个问题太难了,要么放弃,要么琢磨最简单的情形与原始问题之间的差异。当知道怎样求解2个和尚、1个馍馍的问题之后,我们再增加难度,考虑2个和尚、2个馍馍的问题,以及3个和尚、3个馍馍的问题。

找出问题的最简单情形,从最简单的情形入手,可以有效避免孩子们面对复杂问题时束手无策。所谓下手,所谓破题,所谓“把手弄脏”,就是第二个有效方式。

(3)要学会把复杂问题分解成简单问题

这和上一点是一脉相承的。当面对复杂问题时,首先要思考什么是最简单情况,最简单情况下的问题会不会解。假如最简单的情况会解了,下面的思考方向就是如何把复杂问题分解成简单问题。

还是拿“4个和尚分10个馍馍”做例子,假设知道唐僧吃了1个馍馍,剩下的问题就简化成“3个和尚分9个馍馍”了。把复杂问题分解成简单的、同类型的问题,就朝着最终解决问题前进了一大步。

abb103c8f3bec0cdb025559dacce3a3f.png

当然,这种“假设法”只是一种问题分解手段,除此之外,还有“二分法”等。我们设计了几个题目,比如“求2的平方根”,目的就是引导孩子们领会“二分法”。

(4)枚举容易做,关键是剪枝

如果说计算思维和数学思维有什么不同,我想最大的不同或许在于“枚举法”。其中的道理很简单:人力有限,惧怕枚举;计算机不怕累,不怕枚举,反而有时候喜欢枚举—枚举程序多容易写啊。

碰到哪种问题可以尝试“枚举法”呢?如果一个问题的解是多个变量的组合,我们可以尝试一下“枚举法”。以“数字谜”问题为例,解是多个变量的组合,我们只需要枚举变量的所有组合就可以了。孩子们在数学课上常会碰到这种题目,当时很畏难—不是不会做,而是所有的组合太多了,一想到枚举就发怵。不过到了编程课上就简单了,只需要写一个“嵌套循环”,让计算机拼命算就行了。

当然了,要是组合数量实在太多的话,计算机也枚举不完。这时候的关键是找“最受限制”的变量,用这个变量对枚举树进行“剪枝”。我们在讲“数字谜”时,让孩子们尝试最笨的枚举,然后和带剪枝的枚举进行对比,从而体会剪枝的重要性。

孩子们将来会发现很多问题和“数字谜”问题类似,解是由多个变量组成的。对这种问题,“枚举+剪枝”是行之有效的解题思路。

(5)随机是个利器

孩子们还是小学生,接触的“确定性”方法多,“随机性”算法少。我们设计了“布丰投针估计π”“打圆形靶子估计π”“布朗运动和醉汉的脚步”实验,意在引导孩子们从随机算法的角度思考问题。

“布朗运动和醉汉的脚步”实验,意在告诉孩子们很多天然现象的本质就是随机;而“布丰投针估计π”和“打圆形靶子估计π”实验,是想让孩子们体会到即使是确定性的问题,也可以用随机方法解决。随机采样可以大大减少计算量,不需要特别多的采样,也能得到很好的结果。

(6)仿真物理世界

在学习计算思维的过程中,一个需要防止的倾向是把计算机世界和真实的物理世界割裂开来。

为了防止这种倾向,我们引导孩子们在写程序之前,尽可能先做一些物理实验。比如在写“打圆形靶子估计π”程序之前,先用圆珠笔作飞镖、向靶子上投掷;在写“花粉的布朗运动”仿真程序之前,先用激光笔照射淀粉悬浮液,体会真实的布朗运动;在写“牛顿的大炮”程序之前,先用三根弹簧秤探索拉力分解的奥秘。有了真实的体会再写程序,和没有体会直接写,感觉是大不相同的。

此外,我们在设计题目时非常强调“数学建模”,即怎样把物理世界中的实际问题表示成计算机问题或数学问题。比如我们设计了“森林里有几只老鼠几只猫头鹰”这一讲,意图引导孩子们体会如何仿真“猎物-捕食者”动力学系统;设计了“牛顿的大炮”这一讲,意图引导孩子们体会如何把物理世界“装”到计算机里去。

值得指出的是,“森林里有几只老鼠几只猫头鹰”背后有高深的数学思想;C. Lay写的《线性代数及其应用》中讲到矩阵特征值时,开篇用的就是这个例子。等到孩子们长大了,学习大学数学时,相信会有似曾相识的感觉。

299cfbcc2dc2884c18d6d74ac10cf445.png

总结一下:从粗糙的解开始大胆尝试,不断改进;从最简单的情形做起,把复杂问题分解成简单问题;枚举所有的解,设计“剪枝”技术加快枚举过程;随机采样少量的样本,以减少计算量,这大概就是最基本的计算思维了。我们给本科生、研究生讲的无非也是这几条,只不过是更深、更广一些罢了。

德国数学家、数学教育家F. Klein写了一本书,书名叫作《高观点下的初等数学》,其核心观点之一是“有些基础数学,从高观点下才能看得更加明白”。我们把讲授给本科生、研究生的计算思维做了筛选,然后讲授给孩子们;不揣浅陋,这或许可以称作“高观点下的少儿计算思维”吧。

为了便于孩子们理解和掌握计算思维,我们还设计了一些游戏,比如“找钻石”游戏是为了体会“二分法”,“走迷宫”游戏是为了体会陶哲轩提出的解题大法—解题无非是尝试寻找一条从已知到结论的路径。我们几位老师平时研究的就是算法和系统,所以给孩子们讲授的计算思维自然而然地带有浓厚的“数学思维”和“系统思维”色彩。

大概花了4个月的时间,我们就教完孩子们编程了,包括编程基础知识和计算思维。那孩子们学得到底怎么样呢?

事情很是凑巧,2021年5月22日计算所举办“公众科学日”活动,其中一个节目是我带着小SIGMA们做一期“知乎课堂”,讲的题目是“如何用Scratch编程实现一只阿尔法小狗”。台下有300名现场观众注视,线上还有30万观众观看,孩子们顶住压力,现场编程,出了bug现场解决,成功实现了会下tic-tac-toe棋的阿尔法小狗;然后给观众讲解背后的原理和编程步骤,邀请观众进行“人狗大战”;最后又分成两个战队进行“狗狗大战”,看哪一队设计的阿尔法小狗更厉害。

现场完成编程和讲解,说明孩子们掌握了基本的计算思维和程序设计技能。此外,张秦汉小朋友参加“核桃杯”编程大赛,获得了北京市金奖,也是一个小小的证明,值得鼓励。

我们在讲课时就要求孩子们做笔记,记录自己的理解、实验设计思路和实验结果。孩子们轮流来,每一讲都推选一位小朋友负责整理笔记:写程序、分析实验结果、上网查资料,这通常需要花费一周的时间。孩子们写完之后,由我们修改、校补和点评,最终汇集成了这本小书。我们所做的大修改都以“教师点评”的形式明确标识,尽量把修改最小化,以保持孩子们写作的原汁原味—童言童语,自当胜过老生常谈。

这本书是孩子和家长共同劳动的成果:部分插图是孩子们手绘的;封面是刘卫玲设计的;全书由包云岗、张春明、谭光明、兰艳艳、何海芸校对。每一位家长都没有缺席。

在我的心目中,小SIGMA数学特别兴趣组不是一个课外补习班,而是我们这些做父母的和孩子们做的一场亲子游戏,是把我们的思考和领悟教给孩子们的一次传承,是共同领略数学思维和计算思维的一次探秘之旅。

我们这些家长们会永远记得这段时光。我想我们的孩子们将来上了大学,学到高等数学、概率论、计算机算法、人工智能时,应该时不时会感觉似曾相识,大道至简,当会心一笑罢。

是为记。

中国科学院计算技术研究所 卜东波

e826a48ff898477c89c5720dafc9f6ab.png

4f399eca10c75b46e186e137d67aa79b.gif

视频推荐👇

b30f124b47a76c7a7336f7cdd470ec55.gif

更多精彩回顾

书讯 | 4月书讯(上)|  上新了,华章

书讯 | 4月书讯(下)| 上新了,华章

资讯 | 分布式系统一致性的本质,看这篇秒懂

书单 | 知乎高赞:有哪些你看了以后大呼过瘾的数据分析书?

干货 | Go语言精进之路:你知道什么是Go语言编程思维吗?

收藏 | 终于有人把Scrapy爬虫框架讲明白了

上新 | Verilog HDL与FPGA数字系统设计第2版

赠书 | 【第101期】什么是中台架构?真的“烧钱”吗?

活动 | 【向上突破系列】第1期:互联网裁员潮下,去还是留?

直播 |重磅!分布式数据存储与一致性解决方案峰会来袭

b1d89d052bc3034d113816c7d646771a.gif

相关文章:

  • 我来告诉你Go项目标准结构如何布局
  • 终于有人把智能制造与工业4.0讲明白了
  • 你的工资是怎样被平均的?终于有人把平均数、中位数和众数讲明白了
  • 隐私计算:使用混淆电路开源框架Obliv-C解决百万富翁难题
  • MySQL 批量插入数据,一次插入多少行数据效率最高?
  • 智能风控行业发展浅见
  • 5月上新(下)丨设计致物系列+少儿编程好书推荐
  • 5月上新(上)丨元宇宙、因果推断、薛定谔方程...你关注的都在这
  • 【第102期】传统企业如何应对数字化转型?这些书给你答案
  • 如果机器翻译始终存在缺陷和错误,那它还有什么用处?
  • 为什么每一名程序员都应该学习 C++?
  • 终于有人把数据、信息、知识讲明白了
  • 因果推断会是下一个AI热潮吗?朱迪亚•珀尔新作《因果论》重磅上市!
  • 为企业数字人才建粮仓:专访极客邦科技双数研究院院长付晓岩
  • 2022美国科学院院士名单公布:图灵奖得主、龙书作者Alfred V. Aho当选!
  • 【391天】每日项目总结系列128(2018.03.03)
  • CAP 一致性协议及应用解析
  • CSS 三角实现
  • git 常用命令
  • iOS编译提示和导航提示
  • Javascript弹出层-初探
  • Java基本数据类型之Number
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • learning koa2.x
  • miaov-React 最佳入门
  • MySQL用户中的%到底包不包括localhost?
  • Python进阶细节
  • 如何使用 JavaScript 解析 URL
  • 学习笔记:对象,原型和继承(1)
  • 用Visual Studio开发以太坊智能合约
  • 自制字幕遮挡器
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 如何用纯 CSS 创作一个货车 loader
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • (06)Hive——正则表达式
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (四)Android布局类型(线性布局LinearLayout)
  • (四)图像的%2线性拉伸
  • .NET 的程序集加载上下文
  • .Net 知识杂记
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET开发者必备的11款免费工具
  • .NET下的多线程编程—1-线程机制概述
  • /etc/sudoer文件配置简析
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [Android]创建TabBar
  • [ANT] 项目中应用ANT
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • [delphi]保证程序只运行一个实例