内容正文:
教学设计
太仓市明德高级中学 赵 斌
课题
非数值计算
教学目标
1. 运用合适的算法形成解决问题的方案
2. 了解算法中的分治思想,运用二分法查找来解决实际问题
3. 体验递归算法,结合具体问题进行编程实践。
教学内容
教学重点:
1. 在实际问题解决过程中理解分治思想
2. 掌握二分法和递归法的原理
教学难点:
1. 理解二分法和递归法并尝试解决实际问题
2. 正确分析问题并形成与之匹配的问题解决的方案
教学过程
一、课堂导入:展示流程图如下:
引导学生分析,描述该流程图实现的功能是:(猜数字)。
从读流程图的过程中了解学生对计算机解决问题的过程的认知情况,为后续课堂开展做好铺垫。
语句1:cai==num
语句2:cai<num
(请学生上台将判断语句拖放在正确的目标区域,完善流程图后能正确实现所需的功能)
二、二分法学习
1.执行“while循环猜数字.py”程序,尝试猜数字游戏,观察游戏过程,进一步理解导入中的流程图所描述的问题解决过程,根据学生的运行情况,引导应用二分法来完成数字游戏。 (程序代码如下)
'''
猜数字游戏,随机生成1到10之间的数字(含1和10000),每次输入一个数字,
如果与随机生成的数字相同,则退出,否则重新输入,输入-1表示退出游戏。
'''
import random
jznum = random.randint(1, 10000)
normal = True#设置条件的初始值
count = 0
while normal:
number = int(input("请输入你要猜的数字[1,10000],退出程序请输入-1
"))
if number == -1:
normal = False#设置条件的值,使得退出循环
print("程序已退出,游戏结束")
if number == jznum:
count += 1
print("你猜中了,本次数字为:", number, "猜了:", count, "次", "本次游戏结束,程序将退出")
print("游戏结束")
normal = False
else:
if number > jznum:
count += 1
print("你猜了:",count, "次", "大了,请继续猜")
else:
count += 1
print("你猜了:",count, "次", "小了,请继续猜")
input("回车可退出程序")
2.执行“循环猜数字提示过程.py”,理解并描述二分法的运行思路。(程序如下)
在“while循环猜数字.py程序中,”,将提示语句修改为加粗部分语句。
if number > jznum:
count += 1
maxnum = number
print("你猜了:",count, "次", "大了,请继续,建议猜", math.ceil((minnum + maxnum)/2)) # 表示向上取整
else:
minnum = number
count += 1
print("你猜了:",count, "次", "小了,请继续,建议猜", math.ceil((minnum + maxnum)/2))
引导学生思考二分法的设计四步骤:
1.确定查找区间的左侧边界和右侧边界
minnum=1 maxnum=10000
2.寻找中间数
number = math.ceil((minnum+maxnum)/2)
在这个实现过程中使用了math数学库中向上取整函数ceil,使得求得的中间数有一个规律性的处理。
3.中间数和目标数进行比较,以确定下一步的查找区域
if number > jznum: # jznum是随机产生的让用户去猜测的数
maxnum = number # 右边界左移
else:
minnum = number # 左边界右移
4.重复上述的2、3步骤,直到找到目标数
以上四个步骤归纳后就是二分法的运行思路和设计技巧,在实际应用的过程中,我们还要做临界点的处理。
课堂练习:在网站中完成“翻页游戏”程序调试,观察学生表现。
三、递归法学习
(请学生上台在课件中尝试选择游戏步骤,完成将木块从A搬到C,且最底层最大)
具体实施过程如下图所示
A B C A B C A B C A B C
A B C A B C A B C A B C
当要解决的问题具有一定的关系,我们可以用递归的形式来解决问题。
思路描述:从整体上来看问题,找出关系,找出最小的解决方案。运用Python自定义函数的形式,进行递归法的设计。
在网站中完成“爬楼梯”程序调试,观察学生表现。
情境描述:(日常爬楼梯)
每天来机房上课,学生需要走很多楼梯,有的学生一步一个台阶,有的学生一步两个台阶,以此生活情境为案例,写出爬楼梯的递归程序,看在一定楼梯数量的前提下,如果获取实施方案的数量。
def plt(n):
if n==1:
return 1
elif n==2:
return 2
else:
return plt(n-1)+plt(n-2)
n=int(input("请输入楼梯阶数:"))
print("方案数:",plt(n))
四、策略依据
孙子兵法有云:“凡治众如治寡,分数是也。”我们看一个问题,如果一时难以解决,不妨分割这个问题,形成较小的同类问题,逐渐击破,最终达成解决问题的目的。在程序设计中,我们称之为分治策略。
五、总结反思
分治就是将复杂问题进行分割,形成同类的子问题后,达成较易解决问题的目的,本节课主要以二分法、递归法为学习案例,明确其实现原理,形成问题解决的初步能力。
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$$