案例 基于枚举算法的问题解决
1. 《课程标准》要求
·掌握一种程序设计语言的基本知识,使用程序设计语言实现简单算法。
·通过解决实际问题,体验程序设计的基本流程,感受算法的效率,掌握程序调试和运行的方法。
2. 教学目标
·通过“票据中模糊数字推断”情境,分析数字推断的过程,理解枚举算法的基本原理。(计算思维)
·通过“判断一个数是不是素数”任务,了解枚举算法求解问题的基本过程,能用流程图描述该问题求解的算法,能编写程序并调试运行,实现问题求解。(计算思维)
·体验枚举算法的执行效率,认识优化算法的必要性。(计算思维)
·通过与生活实例的结合运用,学会使用枚举算法解决生活中的实际问题,提高信息安全意识。(信息社会责任)
3. 学业要求
利用程序设计语言实现简单算法,解决实际问题。
4. 教学对象分析
本节课的授课对象是高中一年级的学生,他们已经具有一定的问题解决和规划设计能力,而且乐于动手操作,勇于探索。通过前面课程的学习,学生已经理解了算法及其特征,能用流程图描述问题求解的算法;掌握了Python语言的基本知识,能进行简单的程序编写。但是还缺乏对利用程序解决实际问题过程的系统化梳理,对常用的典型算法(如枚举算法)缺乏深入的理解。
5. 教学重点及难点
教学重点:理解枚举算法的核心思想和典型特征;能结合实际问题,编写程序实现枚举算法并调试运行,解决问题。
教学难点:感受不同算法的执行效率,体验算法优化在问题解决中的价值。
6. 教学方法与教学手段
教学方法:讲授法、任务驱动法、对照实验法和合作探究法(见表2.4-3)。
表2.4-3 讲授法、任务驱动法、对照实验法和合作探究法
教学方法
实 例
讲授法
通过“票据中模糊数字推断”问题导入,讲授枚举算法的基本原理
任务驱动法
以“判断一个数是不是素数”为主要任务,引导学生在枚举算法思想的指导下进行算法分析、程序编写与调试
对照实验法
运用对照实验法,比较“寻找1 000以内的所有素数”的两个程序的运行效率,认识算法优化的重要性
合作探究法
通过小组合作“密码解密”的任务,体会枚举算法思想在实际生活中的运用,培养学生的计算思维
软硬件资源:网络机房、电子白板、教学课件、《希沃白板》软件。
7. 教学过程设计
教学环节
教学内容
学生活动
设计意图
情境导入
引入枚举算法
教师活动:课堂开始创设情境,引入票据中模糊数字推断问题。
一张票据上有一个4 位数字组成的编号。甲说:数字编号的前两位数字相同, 但都不是零;乙说:数字编号的后两位数字是相同的,但与前两位不同;丙说:数字编号是一个整数的二次方。试根据以上线索推断出编号
观察
思考
以实际生活场景作为突破口,引出本节课的主题——枚举算法,激发学生的学习兴趣
数字解密
初识枚举算法
活动1:分析问题(图1)
教师活动:引导学生梳理推断的思路。
师生互动:完成问题的分析。
图1 分析问题示例
根据问题引领,自主思考
本环节以实际生活场景作为突破口,学生通过体验推断模糊数字的实际问题,认识枚举算法,进而总结出枚举算法的三要素,突破本节课的第一个教学重点——枚举算法设计的基本原理
数字解密
初识枚举算法
活动2:设计算法
教师活动:引导学生进行算法分析。根据问题分析,只要一一列举出4位数字AABB中A与B的所有可能组合,保证A≠B且A≠0,再验证二次方根问题,就可以得到问题的解。
师生互动:完成算法流程图。
活动3:梳理归纳
师生互动:分析该问题解决算法的核心思想——枚举算法。教师强调该算法的基本特征:枚举对象、枚举范围和验证条件。
活动4:程序实现
教师演示:打开程序文件,分析对应算法的程序语句。运行程序,体会利用计算机程序实现枚举算法的优势
1.观察与思考,完成算法流程图,总结枚举算法的基本原理。
2.观察程序,体会用计算机程序解决问题的优势
本环节以实际生活场景作为突破口,学生通过体验推断模糊数字的实际问题,认识枚举算法,进而总结出枚举算法的三要素,突破本节课的第一个教学重点——枚举算法设计的基本原理
素数探究
深窥枚举算法
探究任务: 判断一个数是不是素数
教师提出任务,小组合作进行任务分析,并交流。
(1)已知条件:素数的定义(只有“1”和它本身两个因数的数)。
(2)求解目标:判断这个数是不是素数。
(3)求解方法:逐一(强调不遗漏且不重复)判断(验证条件)。
活动1:算法分析——理解枚举算法
进行算法流程图分析,完成自主探究任务——绘制流程图(图2),理解枚举算法
完成活动1(可以借助学案和微课),并展示
通过任务驱动,自主分析枚举算法的应用,理解枚举算法的基本原理,培养计算思维
图2 “判断一个数是素数”流程图半成品
素数探究
深窥枚举算法
师生互动:师生在黑板上借助流程图,共同梳理判断一个数是不是素数的过程中的三要素:在确定枚举对象后,最重要的是确定枚举范围和验证条件。
活动2:编写程序——实现枚举算法
学生根据流程图编写程序,并调试运行,得到结果。(选出一位同学在电子白板上操作)
教师活动:利用电子白板对学生任务进行总结与评价。
活动3:延伸思考1 000以内的素数查找
提出思考问题:我们已经成功利用程序实现了判断一个数是不是素数。如果需要查找1 000以内的所有素数,哪位同学能说一下自己的思路?
师生交流:这是对1 000个数的“大”枚举,逐一列举出其中的每一个数,判断是否为素数。所以,可以将前面判断素数的程序代码作为这个问题的判断条件。
展示最后完善的流程图,师生修改程序,运行求解
1.展示程序。
2.思考问题,完善流程图和程序,展示
通过编写程序、运行程序、调试程序三个环节,体会利用计算机程序实现枚举算法的全过程
实验对比
感受算法效率
提出问题:借助计算机的高速运算能力,可以利用枚举算法帮助我们解决这一问题,比人工查找方便很多。但是,大家有没有想过,如果数据量太大,计算机会不会“累”?
师生归纳:计算机虽然不“累”,但如果数据量太大,会影响速度,因此需要考虑算法效率。
算法效率指算法执行的时间,即程序在计算机上运行时所消耗的时间
思考
回答问题
素数问题升级,强化对枚举算法的应用。
本环节是突破本节课的教学难点:感受不同算法的执行效率,体验算法优化在问题解决中的价值。通过学生自己的对比实验,直观地体验不同的枚举算法具有不同执行效率,认识优化算法的必要性,培养学生系统化的计算思维以及创新能力
展示任务:给出解决“寻找1 000以内的所有素数”问题的两种算法的对比程序,如表1所示, 以两个同学为一组进行关键代码,运行两段程序,从枚举对象、枚举范围和验证条件等方面分析哪种算法更好?好在哪里?填写“ 两种方案比较”表,如表2所示。
展示学生任务完成情况,并总结:方案2运行速度更快,效率更高,原因是方案2的程序缩小了枚举范围,进而减少了逐一验证的次数,提高了程序的运算效率,较方案1的算法更优化
完成对比实验并认识到算法效率的重要性
实验对比
感受算法效率
表1 两种方案的关键代码
方案1的关键代码
方案2的关键代码
k = 1
for n in range(2, 1000):
for j in range(2, n):
if n % j == 0:
k = 0
if k == 1:
print(n)
k = 1
import math
k = 1
for n in range(2, 1000):
m = math.ceil(math.sqrt(n)) + 1
if n == 2:
print(n)
for j in range(2, n):
if n % j == 0:
k = 0
break
if k == 1:
print(n)
k = 1
表2 两种方案比较
比较项目
方案1
方案2
枚举对象
枚举范围
验证条件
情感升华
总结枚举算法
1. 课堂回顾与总结。
枚举算法思想在生活中解决问题的适用情况及特点:
① 运算量大;
② 求解数量有限;
③ 所有的可能情况都符合一定的规则。
2. 枚举的应用与延伸。
枚举算法是计算机解决问题的基本算法,在生活中有广泛的应用。例如,有的系统设计6位阿拉伯数字作为密码,6位数字所有的排列组合共有1 000 000种,这就意味着最多只需尝试一百万次就可破解密码,对计算机来说这是一个非常小的值。这就是绝大多数系统对用户设置密码验证次数限制的原因,一旦超过限值,用户账户就会被锁定。
提出问题:如何保护自己的密码安全?
教师展示保护密码安全的技术(如指纹验证、图片验证等),帮助学生建立信息安全意识。
延伸:思考枚举算法还有哪些应用
回顾学习过程,交流密码设置安全性问题, 了解枚举算法的更多应用,拓展思路
对枚举算法的应用进行情感升华,帮助学生建立正确的信息社会责任和信息保护意识