以考定教促学:算法思维教学的实践与思考
作者: 袁华
算法作为稳定的信息技术/科技课程核心内容,所展现出来的思维内涵与思维能力的可测评特征非常显著,其学习深度与广度也一直被一线教学从各角度不断研究,本期解码将从浙江省高中教学一线观察与探索算法教学如何实现生成式的计算思维培养。
摘要:本文通过对浙江省技术选考信息技术部分的深入分析,发现计算思维核心素养培育存在短板。作者通过学生访谈、教学实践,从教师“教”与学生“学”的维度提出了多元思维碰撞形成融合思维、一题多解丰富算法思维内涵、迭代优化引领算法思维提升等教学策略,以期为一线教学提供有益的参考。
关键词:算法思维;技术选考;高中信息技术
浙江省针对信息技术新课标新教材的高考技术选考已经历三次考试。试题紧扣教材,关注学生“必备知识、关键能力、学科素养、核心价值”四个层面,凸显学科育人价值,强调信息技术学科的基础性、综合性、应用性和创新性,从多方面促进了信息技术课程的有效教学和有效学习。
数据表征:揭示学生计算思维培养有待加强
浙江省教育考试院在每次选考之后都会发布本次选考命题解读与答题分析,反映学生学科知识的掌握状况、学生学科核心素养掌握状况、学生学业质量水平掌握状况以及试题难度分布情况。通过对浙江考试答题数据进行聚类分析,可以得到浙江省高中信息技术高考选考试卷核心素养试题分布。其中,“信息社会责任”的掌握率最高,第二是“数字化学习与创新”,第三是“信息意识”,而“计算思维”的掌握率最低。这显示出在新课程改革中,教学从为“知识与能力”而教转变为为“思维与素养”而教,转换过程中存在的问题也提示,在学生计算思维培养方面的教学策略有待优化。因此,教师应针对“考情、教情、学情”的实际,加强计算思维能力培养的教学方法及策略的研究。笔者认为,提升高中信息技术学科教学品质的重要且有效的途径是重视算法思维的培育。理由有三点:①在信息技术选考中有关算法思维、编程实践的比重最大,超过50%;②在国际上通行的计算思维综合测评方案中,算法思维是非常重要的评价维度之一;③信息技术(科技)课程中的“科学原理”的本质是算法,课程核心目标指向学生解决问题的能力。因此,算法思维是计算思维的核心,发展算法思维就是发展计算思维。
适应变革:指向算法思维培养的教学方式转变
根据《普通高中信息技术课程标准(2017年版2020年修订)》(以下简称“新课标”)和学科指导意见,结合高考选考的方向,笔者认为在教学中可以从以下三个维度去改变。
1.基于学科大概念进行教材二次加工
选考试题注重知识结构化、综合性,新课标解读也明确提出要通过大概念使知识结构化、系统化。大概念教学能够帮助学生全面、系统地理解信息技术知识,培养自主学习、问题解决及迁移的能力。同时,大概念教学基于真实的情境,以问题链、任务串的形式开展,有利于激发学生的学习兴趣和创新精神。
例1:开发班级积分系统。
学习情境:利用所学知识开发一个班级积分系统。班级积分主要包括:学习加减分,进步和退步都按班级规则计分;纪律加减分,表扬和违纪都要按班级规定相应加减分;班级宣传和文体活动获奖都可以加分;值日卫生结果的加减分;做好人好事加分等。
在项目实施过程中,需要精心规划每个组成部分的评分机制与数据存储方式。审慎选择使用列表还是链表结构来存储数据,以及在完成数据统计后,应选用列表还是字典来汇总信息。还需制订明确的策略,以处理班级学生个人统计的总分,并实现积分查询等功能,确保整个流程的科学性、严谨性和高效性。
2.多元思维碰撞,形成融合思维认知
学生在构建算法模型前,易把问题想得很简单,这时应将学生的逻辑思维、归纳思维及其他认知思维进行拓展和碰撞,形成思维融合的理解通道。
例2:开发班级积分系统投票功能。
学习情境:班级积分系统需要用到投票功能,每当学校要评选十佳孝星、自律之星、礼仪之星时,班级学生都需要通过投票确定人选。
(1)学生的融合思维认知。为了更好地实现融合思维,可先让学生根据感知、体验、判断与推理等方式,介绍自己认知思路,再经过应用逻辑思维、归思维进行整理。例如,班级学生大致形成两种思路:
生1:每位同学在每张投票纸上写10位同学的名字,然后统计出来。
生2:给班级48位同学设定2个值(1或0),1表示同意,0表示不同意,然后输入电脑自动统计。
(2)构建不同的算法模型。为了让学生的思路可以通过程序实现,学生建立自己的算法模型:为了输入方便,每个学生都用自己在班级的序号替代名字。因此,有的学生建议产生10个随机数即可。
生1:s1=[random.randint(1,48)for i in range(10)]
学生运行后发现会产生重复的数据。
生2:s2=[random.randint(0,1)for i in range(48)]
学生运行后发现被投票的学生超过了10位。
教师把这两个问题继续抛给学生,让学生寻找解决的办法。
生1:模型只要产生不重复的随机数就可以实现了。实现思想:没出现过的序号加入列表,如果出现过,再随机产生不重复新序号,直到产生相应的个数。
生2:每次随机产生0和1,按顺序加入列表,当列表中1的个数达到10个就结束程序。
程序运行后发现后面序号的学生基本都是0,也就是产生了10个1以后,后面的序号都不考虑了,这样对后面的学生不公平。有学生补充到,应用生1的想法,先得到10个不同的序号,然后再把这些位置上的值设置成1,其他位置的值设置成0。
(3)迭代、优化算法,提升运行效率。以上的算法都涉及10个不重复的随机数。要产生10个不重复的随机数,需要产生的次数大于10次。
经过学生的思想碰撞后,觉得有两种算法可行:
第1种:先随机抽取序列里一个位置的数,然后把这个位置的数用最后一个位置的数替代,缩小产生随机数序列范围-1,这样,后面产生的随机数都不会重复,依次类推。
第2种:先随机抽取序列里面一个位置的数,然后把这个位置的数用列表的pop()函数弹出去,接下来在剩下的序列里面继续抽取一个位置的数,仍然把这个位置的数用列表的pop()函数弹出去,直到抽到相应的个数。
(4)一题多解,丰富算法思维的内涵。从浙江考试反馈的3次选考试题算法压轴题得分可以看出,区分度非常大,对学生的思维要求很高。怎样重塑学生学科信心,培养学生的算法思维?一题多解是一个有效的途径。下面以约瑟夫问题为例,让学生用列表、链表、队列等分别去实现。
用列表解决的思路:先按列表顺序开始报数,报到第key个人,让这个列表元素的值置为0,接下来又从1开始报数,报到第key个人,让这个元素的值置为0,如果再报数到最后一个,从头开始,但计数的必须是值不为0的,以此类推,直到最后剩下1个不是0的元素,输出结果。在这个问题解决过程中,学生提出质疑:当列表中0元素增加时出列效率将越来越低,能否用pop()的方法来实现元素真实出列?
用链表实现出列:首先要构建一个循环链表,然后遍历链表,根据遍历计数,把刚好计数到key时的链表数据项删除,最后留下的就是所求结果。用链表建立的算法比较抽象,一开始怎么用语言描述学生难以理解,而通过图形与代码结合的方式学生可以逐步理解。
用队列方法解决的思路:所有人先排成一个队列,从1开始报数,对于计数不是key的数据项让其出队后又入队,对于计数到key的数据项让其出队,当最后队列元素只有1个时,输出结果。
队列思想比较简单,但不少学生对在什么时候需要出队,什么时候出队又入队分不清楚,那么,可以借助模拟算法的过程来加深理解。
通过引导学生从不同角度、不同方法去解决问题,既可以加深学生对该问题的理解,又可以培养其逻辑思维能力和创新思维能力,从而不断提高学生的算法思维。
以生为本:指向算法思维培养的学习方式转变
通过访谈,笔者发现多数学生在考试时间分配上有问题,导致最后的大题来不及做。其主要原因是学生看不懂大段代码,这是因为在平时的学习中学生没有养成良好的程序阅读习惯和思维归纳整理习惯。下面,笔者通过部分案例介绍学生习得算法思维的方式。
1.先分后装,以模块突破整体项目
选考试题第15题设定了一个由n个单位(编号从1至n)参与的特定活动场景,旨在通过小组划分的方式,综合评估学生对程序的理解和分析能力。通过模块化形式,引导学生逐步深入掌握项目的实践流程,直至完整实现。这个例子给了学生很好的借鉴,在学习中要把项目分解成很多子项目,并结合教材相应的内容不断去实现。例如,班级积分系统某个方面的计分,就可以让学生写成自定义函数,并标记该函数的功能,在最后的主程序中调用该函数就可以。当学生读取数据后,调用相应的自定义函数,把数据的流转厘清,最后的项目就会慢慢实现。在考试时,学生可以先分析试题考查什么知识点,与所学的知识有没有类似,可以从哪个角度去思考这类题目,由此不断总结提升自己的思维。
2.思维碰撞,拓展思维广度和深度
在班级积分系统中,对于实现某个功能,不同的学生会有不同的想法,教师要充分调动学生的思维,不断拓展思维空间。例如,要在班级积分系统中根据统计取出前n位高票学生:
生1:把所有同学的得票结果加入一个列表,按降序排序,把索引是n-1位置的设置为key,最后把原始数据大于等于这个值的序号和选票结果输出。
生2:将每个同学的选票结果复制到一个新列表tmp,取出tmp中的元素最大值,用列表pop()的方法弹出去,对剩下的列表元素依次处理,直到弹到第n个……
生3:将每个同学的选票结果先复制一个新列表tmp,再对tmp中的每个数据项的值都减1,统计有几个数大于0,如果个数超过n,则进行下一轮重复操作,直到tmp列表中数据项值大于0的个数小于n个,则输出所有大于等于0位置。
在这几位学生的启发下,其他学生开始选择自己可以理解的方法尝试编写程序。在自己的摸索和同学互助下,绝大多数学生都能实现。这时,课堂可以放慢节奏,让学生再尝试另外两种方法,并且领悟几种方法的异同。
生:在生3的想法中,如果选票数量特别大,效率不高,能否提升效率?
有的学生还提出每次减去列表中最小值,或者减去列表中最大值和最小值的中间值,或者其他……这些都可以留给学生自己去编程验证。
3.归纳总结,提升形式化迁移能力
在计算机科学中,任何问题最终都被分治为二进制运算。特别是在遇到只有两种可能性的问题时,利用二进制的思想来求解是一种高效且直观的方法。在学生学习了枚举算法和进制转换的基本思想后,笔者给学生留下了一个著名的历史问题——李白买酒(如上图)。
关联:一开始学生用数学列方程的方法求解。教师提问:“如果用编程的思想,同学们怎么解决呢?”学生一开始找不到解决的办法,但经过提醒,把酒店和赏花看成两种不同的状态,那么这个问题就和以前学过的二进制知识关联了,把酒店看成1,把赏花看成0,如果遇到1,则变量的结果乘以2,如果遇到0,则变量的结果变成原来的变量减1。这个问题就可以看成“101010”求解原始变量问题。
迁移:把这个问题修改一下,如果不是到店马上又赏花,只告诉你店和花一共有10个位置,李白的酒壶中酒由你输入,经过10个位置刚好喝光壶中酒,店和花顺序有多少种可能呢?这时学生可能会一个个去列举,把所有的可能都列出来。但有的学生会迁移二进制的思想,把10位二进制所有可能一一验算,如果刚好喝完,就输出这种可能的店和花顺序结果。
提升:在处理生活中的问题时,有很多都跟时间有关。有的需要把时间转换成秒,也有的输出结果需要把秒转成“时∶分∶秒”,其实这本质上都是进制转换问题(60进制转10进制)。因此,可以归类整理进制思想解决的问题情境,以备更好地迁移。
学习的过程是一个持续积累知识,并将所学知识应用于实际问题的过程。学生只有自觉地进行归纳总结,不断地将所学知识进行应用、迁移,才能提升学习能力,个人素养才能得到发展。
参考文献:
[1]中华人民共和国教育部.普通高中课程方案(2017年版2020年修订)[S].北京:人民教育出版社,2020.
[2]中华人民共和国教育部.国务院办公厅关于新时代推进普通高中育人方式改革的指导意见[EB/OL].https://www.gov.cn/zhengce/zhengceku/2019-06/19/content_5401568.htm.
[3]任友群,黄荣怀.《普通高中信息技术课程标准(2017年版2020年修订)》解读[M].北京:高等教育出版社,2020.