【摘 要】本文以“枚举算法”教学案例为例,开展了指向计算思维培养的高中Python编程教学实践。依托情境化推理游戏引入,以层层递进的活动和问题链,拓展了学科思维视角,培养了学生的计算思维。
【关键词】计算思维;高中信息技术;Python编程;教学实践
【中图分类号】G434 【文献标识码】A
【论文编号】1671-7384(2022)08-060-04
案例背景
《普通高中信息技术课程标准(2017年版)》的颁布实施与新教材的使用,使普通高中信息技术教学由传统的注重技能实操转向更加强调学生计算思维等核心素养的培养。计算思维是指学生运用计算机科学领域的思想方法,在形成问题解决方案的过程中产生的一系列思维活动,已经成为高中生必备的基本思维能力和素养。同时,被赋予学生计算思维培养重任的Python语言进入高中课堂。Python语言具有语法简单、代码开源、类库丰富、容易入门等特点,更加注重解决问题的算法实现和思维表达,在编程教学实践中有利于培养学生的计算思维。本文以教育科学出版社(2019年版)的《数据与计算》第四单元“算法及其特征”中的“枚举算法”为例,从创设情境、新知学习、归纳梳理、拓展提升、迁移应用五方面分析指向学生计算思维培养的设计策略。
案例描述
1.创设情境,引出枚举
新课标倡导基于真实情境开展教学,通过创设教学情境,借助问题驱动,激发学生的学习兴趣,从而提高课堂效率。
活动1:谁是冠军
问题描述:这次面试的冠军在A、B、C、D四位同学中。A说:“不是我。”B说:“是C。”C说:“是D。”D说:“C说的不对。”其中三个人说的是真话,一个人说的是假话,你能判断出到底谁是冠军吗?
问题分析:首先,假设A是冠军,则A假,B假,C假,D真,此假设不成立;其次,假设B是冠军,则A真,B假,C假,D真,此假设也不成立;再次,假设C是冠军,则A真,B真,C假,D真,此假设成立;最后,假设D是冠军,则A真,B假,C真,D假,此假设也不成立。故得出C是冠军。
小结:按照问题本身的性质,一一列举出该问题所有可能的解,然后根据已知条件对所有可能的解逐个进行验证,从中找出符合要求的正确的解,这种解决问题的方法,我们称之为枚举法。
提问:请列举枚举法解决问题的事例?
设计意图:借助推理游戏引入课堂教学,活跃课堂气氛,迅速集中学生的注意力。在问题解决中,自然引出本课题—— 枚举法。通过追问枚举算法在生活中的应用(比如找钥匙、自行车补胎等),引入后续的教学。
2.新知学习,初识枚举
通过“谁是冠军”活动,让学生对于枚举算法思想有初步的4MWRE6NQ9hIE+sCIVHjf+g65iHaoXBhrJKcbdQASxZI=认识,引出寻找“水仙花数”活动。水仙花数的查找,非常适合使用枚举法,然后过渡到通过Python语言实现枚举算法,体现计算思维。
活动2:寻找“水仙花数”
问题描述:“水仙花数”是指一个三位数(正整数),其各位上的数字的立方和等于该数本身,如:153=13+ 53 + 33,则153是一个“水仙花数”。要求:找出所有“水仙花数”。
问题分析:
(1)枚举算法分析,根据问题描述如下。
①所有可能的解是什么(三位数)?可能有哪些数(100~999)?
②逐一验证的条件是什么?(水仙花数特征)
(2)代码实现分析。
①枚举范围的代码实现
如何枚举所有三位数?运用什么代码实现(range函数)?从100到999逐个验证,需要重复检验900次,这种重复执行的过程通过什么语法结构(循环)来实现?
②枚举验证条件的代码实现
各位上数字的立方和是否等于该数本身,分支结构(if语句)。
通过上述分析,可得枚举法解决水仙花数问题的代码如下。
for n in range(100,1000): #枚举所有三位数
gw=n%10 #提取个位数
sw=n//10%10 #提取十位数
bw=n//100 #提取百位数
if n==gw**3+sw**3+bw**3: #验证条件
print(n,"是水仙花数")
活动3:破解“QQ密码”
问题描述:因为一段时间没上QQ,小明把密码忘了。他记得密码是5位数字,因为自己是8月1日出生,而他妈妈的生日是9月1日,爸爸的生日是10月4日,所以还记得密码是81、91和104的公倍数。你能设计一个程序,帮他找回密码吗?
问题分析:
(1)枚举对象?(2)枚举范围?(3)验证条件?
参考代码:
for n in range(10000,100000):
if n%81==0 and n%91==0 and n%104==0:
print("QQ密码是",n)
设计意图:使用寻找“水仙花数”作为案例讲解,算法阐述简单且学生容易理解。将程序代码直接展示给学生,让学生理解并运行程序,体验枚举法解决问题过程。通过寻找“水仙花数”程序的学习后,再给出一个与生活密切联系的破解“QQ密码”简单实例让学生模仿,能迅速调动学生探索的欲望,强化对于枚举算法的理解,让学生在模仿中构建Python语言枚举法解决问题的模型。
3.举一反三,理解枚举
通过上述几个活动,总结出Python语言枚举算法解决问题的程序结构,如图1所示。
小结:枚举法解决问题的方法。
(1)三要素:枚举对象、枚举范围和验证条件。
(2)算法特征:一一列举,逐个验证。
(3)程序结构:循环语句嵌套分支结构。通过循环一一列举该问题所有可能的解,在循环内逐一判断该解是否是问题真正的解,若是,则采用,否则进入下一轮枚举。
设计意图:在前两个活动实践的基础上,给出枚举法解决问题的方法,对学生已经构建好的模型框架进一步梳理,帮助学生形成枚举法解决问题的思想和方法。
4.拓展提升,应用枚举
活动4:推断“票据编号”
问题描述:最近警方打掉一个制售假发票的犯罪团伙,并查获制造发票用的印刷模版,但是由于遭到破坏,它的千位和十位的数字已经模糊不清,如图2所示。另据线报,了解到这批五位数的票据编号能被23整除。请帮助警方推断出票据所有可能的编号。
问题分析:
(1)枚举对象?
(2)枚举范围?如何实现多对象枚举?(循环嵌套)
(3)验证条件?(合成新的五位数:1■7■2,能否被23整除)
参考代码:
for i in range(0,10): #千位数枚举范围
for j in range(0,10): #十位数枚举范围
n=10702+i*1000+j*10 #生成新五位数
if n%23==0: #验证条件
print("票据编号为:",n)
设计意图:通过前面案例的学习,学生对于单一对象枚举已没有问题。这里设计了双重枚举对象,一方面是对前面学习内容的拓展提升,也是为下一个多对象枚举活动做铺垫。通过for循环嵌套的引入,让学生掌握多对象枚举的算法编程结构。
活动5:求解“百鸡百钱”
问题描述:我国古代数学家张丘建在《算经》一书中提出了一个数学问题:公鸡5文钱一只,母鸡3文钱一只,小鸡3只1文钱。现在用100文钱买100只鸡,问公鸡、母鸡、小鸡各多少只?
问题分析:
算法方案(1):枚举对象有几个,枚举范围、枚举条件是什么,如何实现?
其代码如下:
for gj in range(1,101): #公鸡枚举范围
for mj in range(1,101): #母鸡枚举范围
for xj in range(1,101): #小鸡枚举范围
if gj+mj+xj==100 and gj*5+mj*3+xj/3==100: #验证条件
print("公鸡数:",gj,"母鸡数:",mj,"小鸡数:",xj)
思考:上述代码中,一共会枚举出多少种可能的组合?是否可以减少枚举次数?
算法方案(2):方案1仅根据公鸡、母鸡、小鸡的只数进行了枚举范围的设定,如果再结合价格,则可有效缩小枚举的范围,公鸡的上限缩小为20,母鸡的上限缩小为33,小鸡的上限仍为100。
其代码如下:
for gj in range(1,21): #公鸡枚举范围
for mj in range(1,34): #母鸡枚举范围
for xj in range(1,101): #小鸡枚举范围
if gj+mj+xj==100 and gj*5+mj*3+xj/3==100: #验证条件
print("公鸡数:",gj,"母鸡数:",mj,"小鸡数:",xj)
思考:在上述代码中,一共会枚举出多少种可能的组合?能不能想办法再减少枚举的次数?
算法方案(3):方案(1)和方案(2)都是三个枚举对象,枚举次数是三个枚举对象可能取值数之积。为了有效减少枚举次数,方案(2)已经尝试在方案(1)的基础上尽可能地缩小了枚举范围,要想进一步减少枚举次数,只能考虑是否可以通过已知条件减少枚举对象了。当公鸡、母鸡的只数都枚举出来后,小鸡的只数就可以表示为“100-gj-mj”了,没有必要再对其进行枚举了。
其代码如下:
for gj in range(1,21): #公鸡枚举范围
for mj in range(1,34): #母鸡枚举范围
xj=100-gj-mj
if gj*5+mj*3+xj/3==100: #验证条件
print("公鸡数:",gj,"母鸡数:",mj,"小鸡数:",xj)
小结:通过对比,我们认识到同一个问题可以从不同的角度思考实现问题求解。枚举算法虽然简单,但要注意优化枚举层数和尽可能缩小枚举的范围,以提高程序的运行效率。
设计意图:经过前面的活动,学生基本掌握了枚举法解决问题的方法。通过经典数学题“百鸡百钱”案例,让学生独立编写完整程序巩固前面所学知识。同时,通过比较三种代码方案,引出算法优化的思想,让学生体会算法优化必要性,培养学生从多角度分析问题、解决问题的能力,提升计算思维品质。
5.知识梳理,迁移应用
枚举法算法浅显易懂、易于理解,且计算机的高速运算能力保证了枚举法的可行性,因此在解决实际问题时应用广泛。枚举算法总结思维导图如图3所示。枚举法的优点也正隐含了它的缺点,使用枚举时,还要从时间复杂度和空间复杂度综合考虑算法的效率,实现算法方案的最优化。
拓展提问:为什么银行取款密码设定次数限制?如何提高密码的安全性?
设计意图:总结枚举算法的思想,强化枚举算法解决问题的思路和程序模型。通过交流密码设置安全性问题,拓展迁移枚举算法的更多应用,帮助学生增强信息安全意识,树立正确的信息社会价值观和责任感。
教学反思
1.明晰课标要求,把准案例设计目标
根据新课标中对于算法教学的建议,通过枚举法的学习要让学生能够从生活实例出发,概述枚举算法的概念与特征,理解枚举算法的基本思想,运用恰当的描述方法和控制结构实现枚举算法。本案例就是通过贯穿由浅入深的活动实践,让学生在一个个活动中解决实际问题,体验使用Python语言实现枚举法程序设计的方法(循环嵌套分支),感受算法效率的重要性,增强运用算法思想解决实际问题的能力,培养思维品质。
2.分析学习内容,开展有效活动设计
面向计算思维的培养,课标中强调:“计算思维作为一种思维方式,需要在解决问题的过程中不断经历分析思考、实践求证、反馈调适而逐步形成。”枚举算法作为使用最为普遍、学生必须掌握和正确运用的一种算法,教学可以基于问题的解决展开活动任务的设计,通过系列有逻辑相关性的任务活动,推动枚举算法知识的学习。活动设计应围绕教学目标展开,引导学生经历算法解决问题的过程,应当体现探究性与实践性,给学生独立思考的机会,任务问题要有开放性,不是触手可得,要体现对学生高阶思维的培养。
3.搭建学习支架,促进计算思维培养
在算法与Python编程语言教学中,由于学生个体之间在认知水平、学习能力等方面存在差异,对于同一个项目任务,有些学生能够很快完成,而有些学生可能就有难度。对于有些知识介绍,教师可以广而告之,学生容易理解接受,但有些稍微复杂的内容,学生就不一定能够很快的理解。为此,可以针对任务实践过程中学生的反馈与表现提供个性化的学习支架来助学。教师可灵活运用一些网络学习平台、数字化学习资源和工具,如流程图、思维导图和程序代码可视化等,帮助学生深层次体验算法解决问题的全过程。通过不同算法方案的比较,使学生体会算法优化的意义。教学要注重学习活动设计,强调信息技术与生活相联系,任务问题设计要体现高阶思维和深度学习,通过小组协作引导学生进行探究和交流,在交流和评价环节,灵活选择学生自评、互评和教师总结相结合的方式,从而全面提升学生的计算思维能力。
计算思维是信息技术学科四大核心素养之一,在信息技术学科教学中研究如何融入计算思维理念和运用计算思维方法,培养学生计算思维能力,具有重要意义。学生学习是一个生动活泼、主动和富有个性化的生成过程。指向计算思维培养的高中信息技术学习内容具有丰富性,学习对象具有差异性,对于不同地域、不同学习环境、不同学业基础的学生实现计算思维能力提升,还需要我们积极探索有效的策略方法。以往的教学过多注重知识的传输,而缺乏能力和思维的培养。只有把知识、技能与思维三者紧密结合起来,将知识建构、技能培养与思维发展融入教与学全过程,以促进学生在主动参与、深刻理解、深度学习中培育和提高信息素养,才能帮助学生不断增强信息意识,发展计算思维,提高数字化学习与创新能力。
注:本文系江苏省教育科学规划课题“普通高中智优生群体健全人格的培养研究”(项目编号:D/2015/02/415);盐城市教育科学规划课题“基于信息时代涵育高中生社会责任素养的实践研究”(项目编号:2018-L-112)的阶段性成果
参考文献
教育部. 普通高中信息技术课程标准(2017年版2020年修订)[M]. 北京: 人民教育出版社,2020.
杨沁憧. 计算思维视域下高中信息技术教材“数据与计算”部分的内容分析研究[D]. 呼和浩特:内蒙古师范大学,2021.
作者单位:江苏省阜宁中学