2.4.2基于枚举算法的问题解决-【新教材】人教中图版(2019)高中信息技术必修一课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章 算法与程序实现
2.4.2基于枚举算法的问题解决
目 录CONTENTS
01 提出问题 引发思考 02 核心学习 枚举算法 03 学以至用 解决问题 04 项目实战 优化为营 05 阅读拓展 网络探索
01
提出问题
提出问题
思考下列问题:
1、开展凑24游戏,1到10,10个数,随机抽出四个数,任意作“加、减、乘、除”四则运算,找出 一种运算结果等于24的方法。(比如“5,4,6,2”四个数,那么方法为:5*4+(6-2)=24。)
提出问题
小组探究:
1、以上问题的是否有相同规律?尝试进行归纳总结。 2、进行推理,请说出相关的解决方法。
02
枚举算法
核心学习
枚举算法的定义:
在进行归纳推理时,依据问题的已知条件,确 定答案的大致范围,在此范围内列举出它所有可 能情况的方法。
在列举过程中,既不能遗漏,也不能重复, 通过逐一判断,验证哪些情况满足问题的条件, 从而得到问题的答案。
05
阅读拓展
阅读拓展
请到网上搜索算法的基本设 计方法,了解递归法,排序法、 回溯法、 动态规划法等解决问题 的方向。
for j in L: if i % j == 0: break
else: L.append(i)
print(L)
项目实战
小组探究:
1、上述写法的效率是否有待提高? 2、读程序,第一层循环的i与列表中的元 素进行了怎样的操作? 3、请进一步优化。
项目实战
1、枚举法是在分析问题时,通过循环、递归或选择, 利用计算机运算速度快、精确度高的特点,对要解决 问题的所有可能情况,一个不漏地进行检验,从中找 出符合要求的答案。 2、枚举可作为某类问题时间性能的底线,用来引出 同样问题的更高效率的算法。
核心概念
枚举算法的基本思路:
1、确定枚举对象、范围和判定条件。 2、逐一枚举可能的解,并验证每个解 是否是问题的解。
枚举算法
开始
N
枚举值在给定的 范围中吗?
Y
N
枚举值符合给定
Y
的条件吗?
输出该枚举值
取下一个枚举值
结束 列举,采用循环来实现;逐个检验,采用选择来实现。
枚举算法
1.模糊数字问题 例:一个五位数,万位和百位不知道,但是57和67的倍数,求
2、某羽毛球赛共有23支队伍报名参赛,赛事安排23支队伍抽签两两争夺下一轮的出线权,没有抽 到对手的队伍轮空,直接进入下一轮,那么,本次羽毛球赛最后共会遇到多少次轮空的情况?(公务员 考试题)
3、 如图 某同学要从甲地到乙地和丙地游玩,其中从甲地到乙地有2条路线 可走,从乙地到丙地有3条路线可走,从甲地到丙地共有百度文库条不同的路线可走, 问从甲地到丙地共有多少种不同的走法?
for j in range(2, i): if i % j == 0: break
else: print(i, end=' ')
项目实战
小组探究:
这种基本写法是否有待改进? 1、第一层循环的i取值时,是否可以排除 偶数? 2、第二层循环j取值时,从2开始到i开平方 取值,思考函数range() 的使用,是否可减 少一半的数?
04
项目实战
项目实战
寻找1000以内的所有素数
欧几里德大约在公元前300年,征明了素数有无数个, 从此人们开始了寻找素数的历程。
项目实战
寻找1000以内的所有素数
确定范围:1和它本身之间的所有数。 满足条件:逐一验证除1和它本身以外的数能否整除。
有关素数例题,前面曾讲引用过,本节课旧例推新。
项目实战
03
学以至用
学以至用
模糊数字推断问题:
票据上有一个4位数字组成的编号: 甲说:数字编号的前两位数字相同,但 都不是零; 乙说:数字编号的后两位数字是相同的, 但与前两位不同; 丙说:数字编号是一个整数的平方。
根据以上线索推断出编号。
学以至用
已知 问题
四个数字应是AABB,其中A≠ 0,A≠B, 且AABB是一个整数的二次方
分析
求解 问题
票据中的数字。
隐含 关系
要求解的4位数字的编号必须同时满足所有的已知条件。 解题时尽量分析出问题隐含条件,缩小枚举的范围,提高算法效率。
学以至用
调试程序:
import math for A in range(1, 10):
for B in range (0, 10): if A != B: k = A * 1000 + A * 100 + B * 10 + B c = int(math.sqrt(k)) # 求票据中数字的平方根并取其整数部分 if c * c == k: # 若k是完全平方数,则找到该票据编号 print("票据编号是:", k)
所有的可能性。(直接枚举所有情况,判断即可)。 2、百钱买百鸡问题
公元6世纪,中国的《张丘建算经》有一道著名的百鸡问题: “今有鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一,凡百钱 买百鸡,问鸡翁、鸡母、鸡雏各几何?” 3、填写运算符问题
添加“+”、“-”,“*”,“/”,4个运算符,使得式子成立: 5 5 5 5 5=5
项目实战
素数定理: 1、从2开始到自身的-1的数中找到一个能整除的(从 2开始到自身开平方的数中找到一个能整除的)。 2、一个合数一定可以分解成几个素数的乘积,也就 是说,一个数如果能被一个素数整除就是合数。(使 用列表保存素数)。
使用定理2,用列表保存上一次的运算结果。
n = 100 L = [2] for i in range(3, n, 2):
素数定理: 1、从2开始到自身的-1的数中找到一个能整除的(从 2开始到自身开平方的数中找到一个能整除的)。 2、一个合数一定可以分解成几个质数的乘积,也就 是说,一个数如果能被一个质数整除就是合数。(使 用列表保存质数)
使用定理1的基本写法:
n = 1000 for i in range(2, n):
2.4.2基于枚举算法的问题解决
目 录CONTENTS
01 提出问题 引发思考 02 核心学习 枚举算法 03 学以至用 解决问题 04 项目实战 优化为营 05 阅读拓展 网络探索
01
提出问题
提出问题
思考下列问题:
1、开展凑24游戏,1到10,10个数,随机抽出四个数,任意作“加、减、乘、除”四则运算,找出 一种运算结果等于24的方法。(比如“5,4,6,2”四个数,那么方法为:5*4+(6-2)=24。)
提出问题
小组探究:
1、以上问题的是否有相同规律?尝试进行归纳总结。 2、进行推理,请说出相关的解决方法。
02
枚举算法
核心学习
枚举算法的定义:
在进行归纳推理时,依据问题的已知条件,确 定答案的大致范围,在此范围内列举出它所有可 能情况的方法。
在列举过程中,既不能遗漏,也不能重复, 通过逐一判断,验证哪些情况满足问题的条件, 从而得到问题的答案。
05
阅读拓展
阅读拓展
请到网上搜索算法的基本设 计方法,了解递归法,排序法、 回溯法、 动态规划法等解决问题 的方向。
for j in L: if i % j == 0: break
else: L.append(i)
print(L)
项目实战
小组探究:
1、上述写法的效率是否有待提高? 2、读程序,第一层循环的i与列表中的元 素进行了怎样的操作? 3、请进一步优化。
项目实战
1、枚举法是在分析问题时,通过循环、递归或选择, 利用计算机运算速度快、精确度高的特点,对要解决 问题的所有可能情况,一个不漏地进行检验,从中找 出符合要求的答案。 2、枚举可作为某类问题时间性能的底线,用来引出 同样问题的更高效率的算法。
核心概念
枚举算法的基本思路:
1、确定枚举对象、范围和判定条件。 2、逐一枚举可能的解,并验证每个解 是否是问题的解。
枚举算法
开始
N
枚举值在给定的 范围中吗?
Y
N
枚举值符合给定
Y
的条件吗?
输出该枚举值
取下一个枚举值
结束 列举,采用循环来实现;逐个检验,采用选择来实现。
枚举算法
1.模糊数字问题 例:一个五位数,万位和百位不知道,但是57和67的倍数,求
2、某羽毛球赛共有23支队伍报名参赛,赛事安排23支队伍抽签两两争夺下一轮的出线权,没有抽 到对手的队伍轮空,直接进入下一轮,那么,本次羽毛球赛最后共会遇到多少次轮空的情况?(公务员 考试题)
3、 如图 某同学要从甲地到乙地和丙地游玩,其中从甲地到乙地有2条路线 可走,从乙地到丙地有3条路线可走,从甲地到丙地共有百度文库条不同的路线可走, 问从甲地到丙地共有多少种不同的走法?
for j in range(2, i): if i % j == 0: break
else: print(i, end=' ')
项目实战
小组探究:
这种基本写法是否有待改进? 1、第一层循环的i取值时,是否可以排除 偶数? 2、第二层循环j取值时,从2开始到i开平方 取值,思考函数range() 的使用,是否可减 少一半的数?
04
项目实战
项目实战
寻找1000以内的所有素数
欧几里德大约在公元前300年,征明了素数有无数个, 从此人们开始了寻找素数的历程。
项目实战
寻找1000以内的所有素数
确定范围:1和它本身之间的所有数。 满足条件:逐一验证除1和它本身以外的数能否整除。
有关素数例题,前面曾讲引用过,本节课旧例推新。
项目实战
03
学以至用
学以至用
模糊数字推断问题:
票据上有一个4位数字组成的编号: 甲说:数字编号的前两位数字相同,但 都不是零; 乙说:数字编号的后两位数字是相同的, 但与前两位不同; 丙说:数字编号是一个整数的平方。
根据以上线索推断出编号。
学以至用
已知 问题
四个数字应是AABB,其中A≠ 0,A≠B, 且AABB是一个整数的二次方
分析
求解 问题
票据中的数字。
隐含 关系
要求解的4位数字的编号必须同时满足所有的已知条件。 解题时尽量分析出问题隐含条件,缩小枚举的范围,提高算法效率。
学以至用
调试程序:
import math for A in range(1, 10):
for B in range (0, 10): if A != B: k = A * 1000 + A * 100 + B * 10 + B c = int(math.sqrt(k)) # 求票据中数字的平方根并取其整数部分 if c * c == k: # 若k是完全平方数,则找到该票据编号 print("票据编号是:", k)
所有的可能性。(直接枚举所有情况,判断即可)。 2、百钱买百鸡问题
公元6世纪,中国的《张丘建算经》有一道著名的百鸡问题: “今有鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一,凡百钱 买百鸡,问鸡翁、鸡母、鸡雏各几何?” 3、填写运算符问题
添加“+”、“-”,“*”,“/”,4个运算符,使得式子成立: 5 5 5 5 5=5
项目实战
素数定理: 1、从2开始到自身的-1的数中找到一个能整除的(从 2开始到自身开平方的数中找到一个能整除的)。 2、一个合数一定可以分解成几个素数的乘积,也就 是说,一个数如果能被一个素数整除就是合数。(使 用列表保存素数)。
使用定理2,用列表保存上一次的运算结果。
n = 100 L = [2] for i in range(3, n, 2):
素数定理: 1、从2开始到自身的-1的数中找到一个能整除的(从 2开始到自身开平方的数中找到一个能整除的)。 2、一个合数一定可以分解成几个质数的乘积,也就 是说,一个数如果能被一个质数整除就是合数。(使 用列表保存质数)
使用定理1的基本写法:
n = 1000 for i in range(2, n):