| 
 新書推薦:
 
  《 
			极限聊斋:王蒙神侃聊斋(精装珍藏版)
			》
 售價:HK$ 
			435
 
  《 
			2025-2028帆船竞赛规则
			》
 售價:HK$ 
			539
 
  《 
			华章大历史042——帝国的骨架:先秦、秦汉地缘政治结构变迁大势
			》
 售價:HK$ 
			539
 
  《 
			香遇中国:中华香史五千年
			》
 售價:HK$ 
			594
 
  《 
			见字如面:奏折里的雍正
			》
 售價:HK$ 
			352
 
  《 
			经纬度丛书·亚历山大帝国
			》
 售價:HK$ 
			347
 
  《 
			金钱的艺术
			》
 售價:HK$ 
			296
 
  《 
			部落:文化本能如何塑造我们的世界
			》
 售價:HK$ 
			403
 
 
 | 
         
          | 編輯推薦: |   
          | 本书获得中国科学院科普专项资助,被中国计算机学会推荐为十大科普图书。 本书是六名小学生的编程学习笔记,忠实记录了中科院计算所三位研究员教授孩子们养成数学思维与计算思维的过程。本书通过25讲编程基础和动手实例,以亲子教育的方式讲述六个基本计算思维,适合6~15岁青少年与老师或家长一起阅读,读者可从书中链接下载实例代码体验。
 3.科学大师和教育名师联袂推荐。
 |  
         
          | 內容簡介: |   
          | 计算思维是信息社会创新型人才的素养。本书是少儿计算思维养成过程的忠实记录:中科院计算所三位研究员组织了小SIGMA 数学兴趣亲子班,教授孩子们数学思维与计算思维;孩子们在学习时编程序、写心得、记笔记,终汇集成册,形成本书。 本书包含10讲编程基础和15讲动手实例,讲述6个基本计算思维,包括从简单的做起、逐级逼近、带剪枝的枚举等,具有3大特色:
 以计算思维为纲,内容深刻;以少儿视角行文,浅白易懂;以动手促进动脑,手脑并重。
 这是一本“孩子写给孩子看”的书,尤其适合中小学生阅读自学。家长和老师也可以本书作教材,以书中的“教师点评”为导读,按“背景知识->基本思路->编程步骤”顺序讲授,后对比、检验实验结果。
 让孩子们在少儿时期建立正确的计算思维,将使其终生受益。
 |  
         
          | 關於作者: |   
          | 小SIGMA数学特别兴趣组的六名学员: 包若宁,中关村一小四年级
 魏文珊,中关村一小四年级
 傅鼎荃,北大附小四年级
 张秦汉,北京双榆树中心小学三年级
 卜文远,中关村一小四年级
 谭沛之,中关村一小五年级
 
 指导老师
 卜东波
 中科院计算所研究员。研究方向为计算机算法设计和生物信息学。在国科大讲授“算法设计与分析”,讲授问题求解思维。
 包云岗
 中科院计算所研究员。研究方向为计算机系统。负责国科大“一生一芯”实践计划,在国科大讲授“操作系统”,讲授系统思维。
 兰艳艳
 清华大学教授、前中科院计算所研究员。研究方向为统计学和机器学习。在国科大讲授“人工智能与机器学习”,讲授机器学习思维。
 |  
         
          | 目錄: |   
          | 目录 
 序 言
 前 言
 教师的话一
 教师的话二
 编程基础篇
 第1讲
 什么是计算机程序?
 一、什么是计算机语言? /2
 二、怎样让计算机听懂Scratch语言? /3
 三、什么是计算机程序? /4
 四、Scratch编程环境简介 /4
 五、Scratch积木简介 /6
 六、怎样让程序运行起来? /10
 七、个Scratch程序“Hello, world!” /10
 八、更复杂的Scratch程序 /11
 九、程序里的bug和debug /15
 十、教师点评 /17
 第2讲
 角色的动作、绘图和音乐演奏
 一、知识点 /19
 (一)角色的方向 /19
 (二)角色变换造型 /20
 (三)角色的画笔 /20
 (四)角色演奏音乐 /21
 (五)角色的遮挡 /22
 二、动手练:一个走动的钟表 /23
 (一)实验目的 /23
 (二)基本思路 /23
 (三)编程步骤 /23
 (四)实验结果 /25
 (五)遇到的bug及改正过程 /26
 (六)思考与延伸 /26
 三、课后作业 /26
 (一)实验一:音乐演奏 /26
 (二)实验二:用计算机键盘弹钢琴 /27
 四、教师点评 /27
 第3讲
 变量:角色的记忆
 一、知识点 /28
 (一)什么是变量? /28
 (二)变量名字的写法 /28
 (三)变量有几种? /29
 (四)什么是局部变量和全局变量? /29
 (五)怎样建立变量? /29
 二、动手练:给托球游戏加一个计数器 /30
 (一)实验目的 /30
 (二)编程步骤 /30
 (三)实验结果 /30
 三、课后作业 /31
 实验:小猫出口算题 /31
 四、教师点评 /32
 第4讲
 循环:重复做动作
 一、知识点 /33
 (一)什么是循环? /33
 (二)“重复执行”积木的种类 /34
 (三)循环的嵌套 /35
 (四)写循环的小秘诀 /36
 二、动手练:阅兵方阵 /36
 (一)实验目的 /36
 (二)基本思路 /36
 (三)编程步骤 /36
 (四)实验结果 /37
 (五)思考与延伸 /37
 三、教师点评 /38
 第5讲
 克隆:角色的双胞胎和多胞胎
 一、知识点 /40
 (一)什么是克隆? /40
 (二)什么时候用克隆? /40
 二、动手练:阅兵方阵列队行进 /41
 (一)实验目的 /41
 (二)基本思路 /42
 (三)编程步骤 /42
 (四)实验结果 /43
 (五)遇到的bug及改正过程 /44
 (六)思考与延伸 /44
 三、教师点评 /44
 第6讲
 条件判断:角色根据情况做动作
 一、知识点 /45
 (一)什么是条件判断? /45
 (二)多个条件的组合 /45
 二、动手练:判断奇偶数 /46
 (一)实验目的 /46
 (二)基本思路 /46
 (三)编程步骤 /46
 (四)实验结果 /47
 (五)遇到的bug及改正过程 /47
 三、教师点评 /48
 第7讲
 过程:程序的模块化
 一、知识点 /49
 (一)什么是过程? /49
 (二)在Scratch程序里怎样实现过程? /49
 (三)调用一个过程时到底发生了什么? /51
 二、动手练:会织网的蜘蛛 /53
 (一)实验目的 /53
 (二)基本思路 /53
 (三)编程步骤 /53
 (四)实验结果 /54
 (五)思考与延伸 /55
 三、课后作业 /55
 实验:彩虹风车 /55
 四、教师点评 /56
 第8讲
 列表:把几个变量合起来
 一、知识点 /57
 (一)什么是列表?为什么要用列表? /57
 (二)怎样理解列表? /57
 (三)对列表的操作 /58
 二、动手练:找出值和小值 /59
 (一)实验目的 /59
 (二)基本思路 /60
 (三)编程步骤 /60
 (四)实验结果 /60
 (五)思考与延伸 /62
 三、课后作业 /62
 实验:计算列表中数据的平均值 /62
 四、教师点评 /63
 第9讲
 字符串:把几个字母合起来
 一、知识点 /64
 (一)什么是字符串变量? /64
 (二)对字符串变量有哪些操作? /64
 二、动手练:元音字母计数 /65
 (一)实验目的 /65
 (二)基本思路 /66
 (三)编程步骤 /66
 (四)实验结果 /66
 三、教师点评 /67
 第10讲
 收发消息:角色之间的沟通和协调
 一、知识点 /68
 (一)角色之间的沟通和协调 /68
 (二)什么是“消息”? /68
 (三)怎样创建消息? /68
 (四)怎样发送消息? /69
 (五)怎样接收消息? /69
 二、动手练:“谁在哪里干什么”游戏 /70
 (一)实验目的 /70
 (二)基本思路 /70
 (三)编程步骤 /70
 (四)实验结果 /73
 三、教师点评 /74
 计算思维篇
 第11讲
 逐级逼近法:刘徽割圆法估计π
 一、实验目的 /76
 二、背景知识 /76
 (一)π是什么? /76
 (二)π是多少? /76
 (三)怎样找一个数尽量接近π? /77
 (四)刘徽割圆法估计π /78
 三、基本思路 /79
 (一)画正多边形 /79
 (二)计算正多边形的边长 /80
 四、编程步骤 /80
 (一)角色设计 /80
 (二)变量设计 /80
 (三)过程描述与代码展示 /80
 五、遇到的bug及改正过程 /82
 六、实验结果及分析 /82
 (一)随着正多边形边数(n)的增加,π的估计值的变化 /82
 (二)大圆小圆的结果一样吗? /84
 七、教师点评 /85
 (一)为何叫“割圆法”?哪里体现了“割”? /85
 (二)本讲采用的方法与刘徽割圆法的差异 /86
 (三)刘徽和祖冲之的生平 /86
 第12讲
 聪明的枚举:巧解数字谜
 一、实验目的 /87
 二、背景知识 /87
 (一)笨的方法怎么填? /87
 (二)如何使得枚举时不遗漏可能的填数方案? /88
 (三)如何手工计算判断次数? /89
 三、基本思路 /89
 (一)笨的枚举法 /89
 (二)聪明一点的枚举法 /89
 (三)更聪明的枚举法 /89
 四、编程步骤 /90
 (一)角色设计 /90
 (二)变量设计 /90
 (三)过程描述与代码展示 /90
 五、遇到的bug及改正过程 /92
 六、实验结果及分析 /92
 (一)算法找到了多少种答案? /92
 (二)对比笨算法和聪明算法的判断次数 /92
 七、思考与延伸 /94
 八、教师点评 /94
 第13讲
 再论聪明的枚举:三阶幻方
 一、实验目的 /96
 二、背景知识 /96
 (一)什么是幻方? /96
 (二)怎样填幻方? /97
 (三)三阶幻方有哪些性质? /97
 (四)三阶幻方的“包卜魏猜想” /98
 三、基本思路 /99
 (一)笨的填法是怎么填的? /99
 (二)聪明的方法怎么填? /99
 四、编程步骤 /100
 (一)角色设计 /100
 (二)变量设计 /100
 (三)过程描述与代码展示 /100
 五、实验结果及分析 /103
 六、思考与延伸 /103
 七、教师点评 /103
 第14讲
 从简单的做起:4个和尚分馍馍
 一、实验目的 /104
 二、基本思路 /104
 三、编程步骤 /105
 (一)角色设计 /105
 (二)变量设计 /105
 (三)过程描述与代码展示 /105
 四、遇到的bug及改正过程 /107
 五、实验结果及分析 /108
 (一)2个和尚分馍馍的分法与馍馍数有何关系? /108
 (二)3个和尚分馍馍的分法与馍馍数有何关系? /109
 (三)4个和尚分馍馍的分法与馍馍数有何关系? /110
 六、思考与延伸 /110
 七、教师点评 /111
 第15讲
 用“试错法”求解鸡兔同笼问题
 一、实验目的 /112
 二、背景知识 /112
 (一)什么是鸡兔同笼问题? /112
 (二)怎样求解鸡兔同笼问题? /113
 三、基本思路 /114
 四、编程步骤 /114
 (一)角色设计 /114
 (二)变量设计 /114
 (三)过程描述与代码展示 /115
 五、遇到的bug及改正过程 /116
 六、实验结果及分析 /116
 七、思考与延伸 /116
 八、教师点评 /116
 第16讲
 随机有威力:打圆形靶子估计π
 一、实验目的 /119
 二、背景知识 /120
 三、基本思路 /120
 四、编程步骤 /121
 (一)背景和角色设计 /121
 (二)变量设计 /121
 (三)过程描述与代码展示 /114
 五、遇到的bug及改正过程 /122
 六、实验结果及分析 /123
 七、思考与延伸 /124
 八、教师点评 /125
 第17讲
 再论随机有威力:布丰投针估计π
 一、实验目的 /127
 二、背景知识 /128
 (一)布丰是谁?布丰实验是干什么的? /128
 (二)历史上研究者做过的布丰投针实验 /128
 三、基本思路 /129
 四、编程步骤 /129
 (一)角色设计 /129
 (二)变量设计 /130
 (三)过程描述与代码展示 /130
 五、遇到的bug及改正过程 /132
 六、实验结果及分析 /132
 七、思考与延伸 /133
 (一)扔圆环的碰线次数 /133
 (二)扔“将圆环掰直变成的投针”的碰线次数 /134
 (三)扔拐弯针的碰线次数 /135
 (四)比较一下长针和短针的碰线次数 /136
 (五)布丰投针能算π的终极解释 /137
 八、教师点评 /138
 第18讲
 玩游戏体会“递归法”:河内塔游戏
 一、实验目的 /139
 二、背景知识 /140
 (一)河内塔的故事 /140
 (二)什么是递归积木块? /140
 (三)递归积木块是怎样执行的? /140
 三、基本思路 /141
 (一)简单的情形:1个盘子 /142
 (二)比较简单的情形:2个盘子 /142
 (三)难一点的情形:3个盘子 /142
 (四)再难一点的情形:4个盘子 /145
 四、编程步骤 /145
 (一)角色设计 /145
 (二)变量设计 /145
 (三)过程描述与代码展示 /146
 五、遇到的bug及改正过程 /146
 六、实验结果及分析 /147
 (一)输入不同的n,验证移动次数 /147
 (二)要是有64个盘子呢? /148
 七、思考与延伸 /148
 八、教师点评 /148
 第19讲
 “递归法”的应用:斐波那契数列与黄金分割
 一、实验目的 /149
 二、背景知识 /151
 (一)斐波那契是谁?什么是斐波那契数列? /151
 (二)什么是黄金分割? /152
 (三)斐波那契数列和黄金分割有何联系? /152
 三、基本思路 /153
 四、编程步骤 /154
 (一)角色设计 /154
 (二)变量设计 /154
 (三)过程描述与代码展示 /155
 五、实验结果及分析 /156
 六、思考与延伸 /156
 七、教师点评 /157
 (一)如果兔子要3个月才成年呢? /157
 (二)斐波那契数列的有趣性质一:相邻月份数目之和 /157
 (三)斐波那契数列的有趣性质二:相邻偶数月份数目之积、相邻奇数月份数目之积 /158
 (四)植物中的斐波那契数列 /159
 第20讲
 玩游戏体会“搜索法”:走迷宫
 一、实验目的 /160
 二、基本思路 /161
 三、编程步骤 /162
 (一)角色设计 /162
 (二)变量设计 /162
 (三)过程描述与代码展示 /163
 四、遇到的bug及改正过程 /167
 五、实验结果及分析 /167
 六、思考与延伸 /169
 (一)采用什么样的策略走合适? /169
 (二) “走迷宫”和解数学题之间有什么关系? /169
 七、教师点评 /169
 第21讲
 玩游戏体会“二分法”:找钻石
 一、实验目的 /171
 二、背景知识 /172
 三、基本思路 /173
 四、编程步骤 /173
 (一)角色设计 /173
 (二)变量设计 /173
 (三)过程描述与代码展示 /173
 五、遇到的bug及改正过程 /177
 六、实验结果及分析 /178
 七、思考与延伸 /178
 (一)采用什么样的策略合适? /178
 (二)傅鼎荃说对8行8列的游戏来说,使用二分法多需要6次,为什么? /178
 (三)用递归的观点想一想 /179
 八、教师点评 /179
 第22讲
 “二分法”的应用:估计的值
 一、实验目的 /180
 二、背景知识 /181
 (一)是怎么发现的? /181
 (二)毕达哥拉斯是谁? /181
 (三)为什么说的发现是一件重要的事情? /182
 三、基本思路 /182
 四、编程步骤 /183
 (一)角色设计 /183
 (二)变量设计 /183
 (三)过程描述与代码展示 /183
 五、遇到的bug及改正过程 /185
 六、实验结果及分析 /185
 (一)除了2,计算一下其他数的平方根,比如3、5、7 /185
 (二)输入不同的初始估计值low和up,需要多少次循环才能估计准? /186
 七、思考与延伸 /186
 (一)有没有更快的方法来估计出呢? /186
 (二)计算2的十二次方根 /187
 八、教师点评 /191
 第23讲
 仿真世界:牛顿的大炮
 一、实验目的 /192
 二、背景知识 /192
 (一)牛顿是谁? /192
 (二)牛顿的大炮是用来做什么的? /193
 三、基本思路 /193
 四、编程步骤 /194
 (一)角色设计 /194
 (二)变量设计 /194
 (三)过程描述与代码展示 /195
 五、遇到的bug及改正过程 /197
 六、实验结果及分析 /197
 七、思考与延伸 /198
 八、教师点评 /198
 (一)如何根据斜方向的拉力F计算出水平方向的拉力Fx和竖直方向的拉力Fy? /199
 (二)平方反比率的推导和背后的原因 /200
 (三)牛顿和他所在的那个光辉时代 /201
 (四)用更大号的三棱镜重做牛顿的光谱实验 /201
 第24讲
 再论仿真世界:森林里有几只老鼠,几只猫头鹰?
 一、实验目的 /202
 二、背景知识 /202
 三、基本思路 /203
 四、编程步骤 /204
 (一)角色设计 /204
 (二)变量设计 /204
 (三)过程描述与代码展示 /204
 五、遇到的bug及改正过程 /207
 六、实验结果及分析 /207
 七、思考与延伸 /208
 (一)要是年只有50万只老鼠呢? /208
 (二)假如1万只猫头鹰每年吃掉0.1万只老鼠呢? /208
 (三)假如1万只猫头鹰每年吃掉0.2万只老鼠呢? /209
 八、教师点评 /209
 第25讲
 博弈初探:会下tic-tac-toe棋的阿尔法小狗
 一、实验目的 /211
 二、背景知识 /211
 (一)什么是tic-tac-toe棋游戏? /211
 (二)人是怎样下棋的? /212
 三、基本思路 /213
 (一)阿尔法小狗怎样表示棋局? /213
 (二)阿尔法小狗怎样判断下在哪里赢面大呢? /213
 (三)阿尔法小狗怎样下棋呢? /215
 (四)阿尔法小狗怎样对棋局进行评分呢? /216
 (五)阿尔法小狗要“深谋远虑”还是“目光短浅”? /216
 四、编程步骤 /218
 (一)角色设计 /218
 (二)变量设计 /218
 (三)过程描述与代码展示 /219
 五、遇到的bug及改正过程 /225
 六、实验结果及分析 /225
 七、思考与延伸 /227
 (一)怎样让阿尔法小狗变聪明? /227
 (二)新玩法:“狗狗大战” /228
 八、教师点评 /228
 (一)阿尔法狗的诀窍之一:控制树不能太高 /229
 (二)阿尔法狗的诀窍之二:控制树不能太宽 /230
 (三)神经网络是怎样学会打分和走子的? /230
 |  
         
          | 內容試閱: |   
          | 小SIGMA数学特别兴趣组成立于2018年,有六名学生,三位家长当老师,是“三个老师六个娃”的亲子班。 我们这个特别兴趣组主要讲数学,的特点是“慢数学”,有时候两个小时才讲一道题。这让我们有足够的时间去思考、尝试,并发现一些好玩的规律。比如讲幻方时,包若宁、卜文远和魏文珊提出了“包卜魏猜想”—若已知三阶幻方的中心格子、左上角、左侧中间格子的三个数,这个三阶幻方就完全确定了。还有在学“鸡兔同笼”时,傅鼎荃自发地想出了“二分法”。
 2020年疫情期间,我们在家里都闷得无聊,便央求老师们教我们Scratch编程。当我们看到一个个美丽的角色,搭搭积木就能写程序时,便深深地爱上了编程。在编程里,似乎所有事情都能实现,于是我们想到什么事情就编程试一下。比如卜文远自发尝试写了一个小程序,用小球模拟病毒的传播。
 在学习编程的这3个月里,我们一起写过很多程序,有四个和尚分馍馍,算π,二分法找钻石……在这么多程序中,好玩儿的就是阿尔法小狗了!这只小狗会下井字棋,它本领高强,每次我们都赢不了它!
 通过编程,可以解决许多数学问题,比如数学里的鸡兔同笼、估算2的平方根等。我们还可以写一个程序估计森林里猫头鹰和老鼠的数目。模拟世界,这感觉很奇妙!
 我们写这本书时初的想法是:大部分编程书都是大人写的,都是以大人的视角来看的。我们想以孩子的视角写一本编程书,于是便一人写几章,把学习心得记录下来,终形成了这本书。
 我们觉得这本书和其他书是不一样的,它记录的是每一位小作者对每讲的看法与总结,记录了我们每个编程初学者对程序从陌生到熟悉并形成自己思维的过程,我们也希望自己的经历可以帮助更多初学小朋友爱上编程和计算思维。我们写的程序都放在https://deltadbu.github.io/6kids_learning_scratch/上,供大家参考。
 希望你们都能喜欢这本书!
 小SIGMA数学特别兴趣组
 2021年8月20日
 
 教师的话一
 2018年的一天,我给同事包云岗打了个电话,说:“孩子们上二年级了,能否在轻松、活泼的氛围下,引导孩子们学一些数学思维呢?”云岗很赞同,我们就一起组织了一个小SIGMA数学特别兴趣组,权且由包云岗、兰艳艳和我担任老师,学员就是我们自己的孩子。
 在这个特别兴趣组中,学生用书是通用的奥数教材,不过教师用书可不太普通—我们用的是G. Polya写的《怎样解题—数学思维的新方法》(How To Solve it)和陶哲轩写的《陶哲轩教你学数学》。换句话说,我们践行的是Polya的数学教育观—重在倾听孩子们的理解和猜想,重在引导孩子们观察、尝试、联想、归纳、做“合情推理”,总之是一种“慢数学”的风格,有时候我们甚至2个小时只讲一道题。
 一开始的确看不出成效,但等到三年下来,才慢慢发现孩子们有了一些进步—当然,这些进步不是指孩子们参加某个杯赛拿了个奖,而是指孩子们掌握了一些基本的数学思维,体现在自己能够提出和证明一些猜想,比如包若宁、卜文远、魏文珊小朋友提出了三阶幻方的“包卜魏猜想”,傅鼎荃小朋友在学习“鸡兔同笼”问题时,完全自主地想出了“二分法”。在思维火花迸发的尤里卡时刻,孩子们兴奋得又喊又跳;躬逢其时,我们也非常欣慰—这是对教师的肯定和褒奖。
 等到了2020年春节,因为出现疫情,孩子们都憋在家里,很是无聊,就嚷嚷着让我们教他们编程。教一门编程语言容易,但是关键不在这里,而在于教“计算思维”,这给我们出了一个不小的难题。
 事实上,包云岗、兰艳艳和我都在中国科学院大学教计算机科学与技术:包老师讲授“操作系统”,负责“一生一芯”实践计划,讲解如何设计CPU和计算机系统;兰老师讲授“机器学习和人工智能”,训练计算机怎样学习;我讲授“计算机算法设计”,包括怎样观察问题和求解问题。简而言之,我们教的都是“计算思维”。
 不过我们面向的都是本科生和研究生,能否教小学生计算思维?教什么?怎么教?这对我们来说是全新的挑战。这可不像教数学,还有Polya和陶哲轩写的书能够当作教材,给我们一些指导。
 我们在开课前思考了很久,教的时候又边教边琢磨,把教授本科生、研究生的计算思维进行裁剪和修改,形成了一个初步的“小学生版”计算思维。
 所谓计算思维,其核心是碰到问题时如何观察、如何尝试,然后如何根据观察到的规律设计计算机程序来求解问题。下面这几条或许是基本的计算思维:
 (1)先正向尝试理解题意,再反向求解问题
 碰到一个问题如何下手?孩子们往往会对着问题发呆,感觉束手无策。这不怪孩子们,求解问题是“反向思维”,有时候的确不太容易一下子就想出来。
 在这种情况下,“先正向尝试理解题意,再反向求解问题”是走出困境的一个好办法。以“鸡兔同笼”问题为例,可以先尝试一下“鸡有0只”,即使这个尝试非常粗糙也没关系,然后验证这个尝试对不对,不对再修改尝试,比如接着尝试“有1只鸡对不对”,如果不对再增加鸡的数目。
 先尝试猜测一个解(或许这个解很粗糙,这不要紧),再验证这个猜测是否满足要求,不满足要求就修改;这种“尝试-验证-改进”策略是“试错法”,也是“逐步改进法”。正向尝试有助于理解题意,或许应该成为孩子们碰到问题时的“反应”。
 这种策略看起来很笨,不过却有三个好处:一是能够使孩子们动起手来,避免发呆;二是能够启发我们写一个求解的程序;第三点更重要,孩子们尝试不了几次,可能就会自己发现规律,想出更好的求解方法—这不是想象或夸张,SIGMA的孩子们就是这样想出求解方法的。
 说得更远一点儿,计算机科学与技术里普遍采用这种“用正向尝试来反向解题”的策略。一个典型的方法就是神经网络的训练过程—尝试设置网络参数,做正向的网络传播,验证传播的结果,如果不好就修正网络参数,终反向求解出网络参数。
 (2)从简单的做起
 碰到一个复杂的问题怎么办?比如“四个和尚分馍馍”问题,唐僧师徒4人化缘化到了10个馍馍,问共有几种分法?孩子们没学过组合数学,看到这么多和尚和这么多馍馍,一下就傻眼了。
 直接求解这个问题是很难的,我们就启发孩子们从简单的做起:4个和尚、10个馍馍的问题不会解,那就先考虑2个和尚、1个馍馍的问题。反过来,如果简单的情形都无法解决,那就说明这个问题太难了,要么放弃,要么琢磨简单的情形与原始问题之间的差异。当知道怎样求解2个和尚、1个馍馍的问题之后,我们再增加难度,考虑2个和尚、2个馍馍的问题,以及3个和尚、3个馍馍的问题。
 找出问题的简单情形,从简单的情形入手,可以有效避免孩子们面对复杂问题时束手无策。所谓下手,所谓破题,所谓“把手弄脏”,就是第二个有效方式。
 (3)要学会把复杂问题分解成简单问题
 这和上一点是一脉相承的。当面对复杂问题时,首先要思考什么是简单情况,简单情况下的问题会不会解。假如简单的情况会解了,下面的思考方向就是如何把复杂问题分解成简单问题。
 还是拿“4个和尚分10个馍馍”做例子,假设知道唐僧吃了1个馍馍,剩下的问题就简化成“3个和尚分9个馍馍”了。把复杂问题分解成简单的、同类型的问题,就朝着终解决问题前进了一大步。
 当然,这种“假设法”只是一种问题分解手段,除此之外,还有“二分法”等。我们设计了几个题目,比如“求2的平方根”,目的就是引导孩子们领会“二分法”。
 (4)枚举容易做,关键是剪枝
 如果说计算思维和数学思维有什么不同,我想的不同或许在于“枚举法”。其中的道理很简单:人力有限,惧怕枚举;计算机不怕累,不怕枚举,反而有时候喜欢枚举—枚举程序多容易写啊。
 碰到哪种问题可以尝试“枚举法”呢?如果一个问题的解是多个变量的组合,我们可以尝试一下“枚举法”。以“数字谜”问题为例,解是多个变量的组合,我们只需要枚举变量的所有组合就可以了。孩子们在数学课上常会碰到这种题目,当时很畏难—不是不会做,而是所有的组合太多了,一想到枚举就发怵。不过到了编程课上就简单了,只需要写一个“嵌套循环”,让计算机拼命算就行了。
 当然了,要是组合数量实在太多的话,计算机也枚举不完。这时候的关键是找“受限制”的变量,用这个变量对枚举树进行“剪枝”。我们在讲“数字谜”时,让孩子们尝试笨的枚举,然后和带剪枝的枚举进行对比,从而体会剪枝的重要性。
 孩子们将来会发现很多问题和“数字谜”问题类似,解是由多个变量组成的。对这种问题,“枚举 剪枝”是行之有效的解题思路。
 (5)随机是个利器
 孩子们还是小学生,接触的“确定性”方法多,“随机性”算法少。我们设计了“布丰投针估计π”“打圆形靶子估计π”“布朗运动和醉汉的脚步”实验,意在引导孩子们从随机算法的角度思考问题。
 “布朗运动和醉汉的脚步”实验,意在告诉孩子们很多天然现象的本质就是随机;而“布丰投针估计π”和“打圆形靶子估计π”实验,是想让孩子们体会到即使是确定性的问题,也可以用随机方法解决。随机采样可以大大减少计算量,不需要特别多的采样,也能得到很好的结果。
 (6)仿真物理世界
 在学习计算思维的过程中,一个需要防止的倾向是把计算机世界和真实的物理世界割裂开来。
 为了防止这种倾向,我们引导孩子们在写程序之前,尽可能先做一些物理实验。比如在写“打圆形靶子估计π”程序之前,先用圆珠笔作飞镖、向靶子上投掷;在写“花粉的布朗运动”仿真程序之前,先用激光笔照射淀粉悬浮液,体会真实的布朗运动;在写“牛顿的大炮”程序之前,先用三根弹簧秤探索拉力分解的奥秘。有了真实的体会再写程序,和没有体会直接写,感觉是大不相同的。
 此外,我们在设计题目时非常强调“数学建模”,即怎样把物理世界中的实际问题表示成计算机问题或数学问题。比如我们设计了“森林里有几只老鼠几只猫头鹰”这一讲,意图引导孩子们体会如何仿真“猎物-捕食者”动力学系统;设计了“牛顿的大炮”这一讲,意图引导孩子们体会如何把物理世界“装”到计算机里去。
 值得指出的是,“森林里有几只老鼠几只猫头鹰”背后有高深的数学思想;C. Lay写的《线性代数及其应用》中讲到矩阵特征值时,开篇用的就是这个例子。等到孩子们长大了,学习大学数学时,相信会有似曾相识的感觉。
 总结一下:从粗糙的解开始大胆尝试,不断改进;从简单的情形做起,把复杂问题分解成简单问题;枚举所有的解,设计“剪枝”技术加快枚举过程;随机采样少量的样本,以减少计算量,这大概就是基本的计算思维了。我们给本科生、研究生讲的无非也是这几条,只不过是更深、更广一些罢了。
 德国数学家、数学教育家F. Klein写了一本书,书名叫作《高观点下的初等数学》,其核心观点之一是“有些基础数学,从高观点下才能看得更加明白”。我们把讲授给本科生、研究生的计算思维做了筛选,然后讲授给孩子们;不揣浅陋,这或许可以称作“高观点下的少儿计算思维”吧。
 为了便于孩子们理解和掌握计算思维,我们还设计了一些游戏,比如“找钻石”游戏是为了体会“二分法”,“走迷宫”游戏是为了体会陶哲轩提出的解题大法—解题无非是尝试寻找一条从已知到结论的路径。我们几位老师平时研究的就是算法和系统,所以给孩子们讲授的计算思维自然而然地带有浓厚的“数学思维”和“系统思维”色彩。
 大概花了4个月的时间,我们就教完孩子们编程了,包括编程基础知识和计算思维。那孩子们学得到底怎么样呢?
 事情很是凑巧,2021年5月22日计算所举办“公众科学日”活动,其中一个节目是我带着小SIGMA们做一期“知乎课堂”,讲的题目是“如何用Scratch编程实现一只阿尔法小狗”。台下有300名现场观众注视,线上还有30万观众观看,孩子们顶住压力,现场编程,出了bug现场解决,成功实现了会下tic-tac-toe棋的阿尔法小狗;然后给观众讲解背后的原理和编程步骤,邀请观众进行“人狗大战”;后又分成两个战队进行“狗狗大战”,看哪一队设计的阿尔法小狗更厉害。
 现场完成编程和讲解,说明孩子们掌握了基本的计算思维和程序设计技能。此外,张秦汉小朋友参加“核桃杯”编程大赛,获得了北京市金奖,也是一个小小的证明,值得鼓励。
 我们在讲课时就要求孩子们做笔记,记录自己的理解、实验设计思路和实验结果。孩子们轮流来,每一讲都推选一位小朋友负责整理笔记:写程序、分析实验结果、上网查资料,这通常需要花费一周的时间。孩子们写完之后,由我们修改、校补和点评,终汇集成了这本小书。我们所做的大修改都以“教师点评”的形式明确标识,尽量把修改小化,以保持孩子们写作的原汁原味—童言童语,自当胜过老生常谈。
 这本书是孩子和家长共同劳动的成果:部分插图是孩子们手绘的;封面是刘卫玲设计的;全书由包云岗、张春明、谭光明、兰艳艳、何海芸校对。每一位家长都没有缺席。
 在我的心目中,小SIGMA数学特别兴趣组不是一个课外补习班,而是我们这些做父母的和孩子们做的一场亲子游戏,是把我们的思考和领悟教给孩子们的一次传承,是共同领略数学思维和计算思维的一次探秘之旅。
 我们这些家长们会永远记得这段时光。我想我们的孩子们将来上了大学,学到高等数学、概率论、计算机算法、人工智能时,应该时不时会感觉似曾相识,大道至简,当会心一笑罢。
 是为记。
 
 中国科学院计算技术研究所 卜东波
 2021年8月23日于北京中关村
 
 
 
 
 教师的话二
 给孩子们的话
 计算思维是什么?也许孩子们是次听到“计算思维”这个词,但相信大家其实早已无意识地在实践计算思维,比如每天早晨上学的过程就是一次计算思维的实践。早上起床后,孩子们就会在大脑中快速形成一个“上学程序”:步刷牙洗脸,第二步换衣服,第三步吃早餐,第四步检查书包,第五步出门,步行或坐车去学校,第六步到校后找到座位,第七步……这其实就是计算思维的一种体现。当然,“上学程序”中的每一步还可以进一步分解为更细的步骤,比如刷牙洗脸又可以分解为挤牙膏、刷牙、漱口、接水、洗脸等,这是计算思维中的模块化思想;“上学程序”中有些步骤还可以并行进行,比如当时间来不及时,可以一边嚼着面包一边换衣服,这是计算思维中的并行思想。
 现在是不是觉得“计算思维”无所不在了?通俗地说,计算思维就是让我们学会用“编程序”的方法来解决问题。但这些“程序”并不一定仅仅在计算机上运行,也可能是由一个人、一个团队或者一个单位去执行。近中国航天领域硕果累累,“嫦娥五号”实现月面取样返回地球,天宫空间站成功发射,“祝融号”首次登陆火星等,为什么中国航天总能完成一个个充满挑战的目标?这正是得益于航天领域的总设计师们精心设计的、由几万个航天人一起执行的“程序”,不仅能保障工程质量,还能缩短开发时间,这就是计算思维在航天领域的应用。
 孩子们也许对计算思维还是有些陌生,但大家都做过数学题,接触过数学思维,这本书希望通过用数学思维和计算思维去求解同一个问题,并进行对比分析,从而让大家体会数学思维和计算思维的区别以及计算思维的威力。将来有一天,当大家能有意识地将计算思维应用到学习和工作中,能把一个复杂任务分解为一个个小步骤,能把这些小步骤变成容易理解的数学模型或者容易执行的操作时,相信大家会发现那些看似复杂的问题变得容易解决了,大家也会变得更有信心去迎接挑战。
 给家长朋友们的话
 作为一名家长,我也经常会想:孩子未来会成为一个什么样的人?应该教给孩子什么?在众多我们希望传达给孩子的知识和能力中,我建议一定要把计算思维列进去。
 我从初中开始学习编程,本科就读于南京大学计算机系,也写过不少程序,但真正深刻认识到计算思维的力量,还是在大学本科毕业十周年的聚会上。当时,一位本科同学说他写了一个程序,为了验证和调试这个程序,他决定改行做高中老师。他设计的程序是这样的:
 1)将高中数学知识公理化。
 2)将解数学题的过程转化为一个搜索过程,即从题干出发搜索出对应的公理组合。
 3)设立几条搜索优先级规则,实现一个高效的搜索算法。
 需要说明的是:这个程序并不是让计算机执行,而是由人(就是高中生)来执行。一批高三学生在用这个程序练习了一段时间后,奇迹出现了—有一位学生次月考数学成绩为41分,第二次月考为71分,第三次月考达到117分,全班第二!
 这个例子给了我很多启示。我开始观察我们生活的世界,其实很多人的工作就是将各种复杂任务转变为一个个程序,由政府、企业、部门和个人去执行。计算思维无处不在!我意识到,应该教给孩子们应用计算思维去认识世界、改变世界的能力。然而,在我们从小到大的成长经历中,却从来没有一门课或一本书来专门介绍什么是计算思维,以及如何训练计算思维。
 于是我们几位家长决定自己去探索一种给孩子们教授计算思维的方式。这本书就记录了2020年上半年我们和孩子们一起进行的一次尝试。正如卜老师所言,这更像是一场亲子游戏,孩子们在学习的过程中始终充满了激情与活力,也充满了对新课程的期待。因此,我想如果要再给家长朋友们一个建议,那就是带着孩子们一起去实践书中的那些题目,一起去对比分析数学思维和计算思维的区别,一起去体会计算思维的威力。
 古人云:“授人以鱼,不如授人以渔。”计算思维,是乃渔也。
 
 中国科学院计算技术研究所 包云岗
 2021年10月8日于北京中关村
 |    |