用递归法解决问题
教材分析
本节课选自《算法与程序设计》选修模块第三单元第三节的内容,本节课是本章的一个难点,通过本节课的学习了解什么是自定义函数,在学习自定义函数的基础上,学习递归算法的程序实现是自定义函数的具体应用,培养学生“自顶向下、逐步求精”的算法思想。
二、学情分析
本节课授课的对象是高二学生,经过一段时间的学习,学生对算法有了一定的认识,能够掌握基本的vb语言;前几节课通过对程序基本结构的学习,已经积累了用计算机编程解决现实中的问题的初步经验。在此基础上学习用递归法解决问题,用自定义函数实现递归算法,对学生来说,即充满了好奇,又充满了挑战。
教学目标
(一)知识与技能:
1、理解什么是递归算法,了解递归法的条件及适用范围。
2、能够利用自定义函数实现递归算法,了解递归法解决问题的优缺点。
(二) 过程与方法:
1、首先通过情景引入了解递归算法的概念,抛出问题之后,标准函数无法解决该问题,接着介绍自定义函数。
2、其次通过案例分析剖析用递归法算法解决问题过程。
3、再次通过经典案例、分层任务的设置增强“自顶向下、逐步求精”的思想意识,培养学生合作学习,协作互助精神。
(三)情感态度与价值观:
1、正确对待规则,养成良好生活学习习惯。
2、学会用递归思想解决生活中的实际问题,树立正确的人生观。
四、教学重点与难点
重点:理解用递归法解决问题的一般过程
难点:应用自定义函数实现递归算法的编程
五、教学策略
由于本节课难度较大,知识又比较系统抽象,所以采用目标教学为主,辅以情境教学,即增强学生对知识的理解记忆。又赋予课堂趣味性。为突出学生的主体地位,本节课,通过汉诺塔游戏体验法来加深对递归法的认识,通过合作探究法来实现递归编程,最后通过经典案例、分层任务次来完成教学目标,让不同层次的学生都能体会到用递归法解决问题的优越性。从而提高学生的学习兴趣。
教学环境
多媒体机房
七、教学过程(3课时)
建议三个课时完成。
教学环节
教学活动预设
学生活动预设
设计意图
课件截图
新课导入
算法思想
观看图片,图片里包含了怎样的算法思想。
观看动态图片思考这幅动态图片有什么特点?
通过观察发现这幅图片自身包含自身,进
而引出递归思想。
算法思想
教师:在我们生活周围也有很多包含这种特点的例子,比方说我们经常玩的汉诺塔游戏。
教师:像上面那种图片和汉诺塔游戏所呈现的特点,其实就具备了递归的特点,这节课我们就共同学习用递归法解决问题。
学生体验汉诺塔游戏后,思考:汉诺塔游戏是如何包含这种自身调用自身的特点的?
通过游戏体验进一步加深对“自身调用自身”这
种思想 的理解,为引入递归法埋下铺垫。
学习目标
展示学习目标。
默读学习目标。
带着目标学习,有方向性。
递归概念
教师:我们刚才提到了递归,那么究竟什么是递归呢?
阅读课本p65页,回想刚才图片和汉诺塔游戏的特点,了解递归的概念。
加深对递归概念的理解。
教学环节
教学活动预设
学生活动预设
设计意图
课件截图
新课导入
标准函数怎么了
教师:展示问题,求一个数n(n为正整数)的阶乘,并思考用我们学过的标准函数还能
解决这个问题吗?那标准函数怎么了?
思考我们学习过的那个标准函数能解决这个问题。
用问题来揭示标准函数有它的局限性,为
引出自定义函数做准备。
自定义函数
教师:既然标准函数无能为力,我们就可以自定义函数。
教师:如何自定义函数,自定义函数如何使用呢?
阅读课本p66页,了解自定义函数的定义形式及调用格式。
以本为本,让
学生养成看课本的习惯。
案例剖析
分析问题
教师:求一个数n(n为正整数)的阶乘。
数学建模:
1!=1 f(1)=1
2!=1*2 f(2)=f(1)*2
3!=1*2*3 f(3)=f(2)*3
4!=1*2*3*4 f(4)=f(3)*4
5!=1*2*3*4*5 f(5)=f(4)*5
…… ……
n!=1*2*3*4*5*….*n f(n)=f(n-1)*n
F(n)= f(0)=1 (n=0)
f(n)=n*f(n-1)(n为正整数)
学生思考建立数学模型,在头脑中形成具体解决问题的思路。
学生讨论归结结论
找到递归法解决问题 的条件
设计算法
教师:由以上问题的分析,我们来总结一下在什么情况下可以使用递归算法来解决问题?
参考:
一、每次计算在规模上都有所缩小。
二、相邻两次重复之间有紧密的联系,前一次要为后一次做准备。比如:f(n)=f(n-1)*n
三、在问题的规模极小时必须用直接给出解答。比如:f(1)=1
学生讨论总结结论
明确递归法使用的前提。
教学环节
教学活动预设
学生活动预设
设计意图
课件截图
案例剖析
编写程序
教师:对照自定义函数规范,引导学生编写自定义函数。
参考代码:
Public Function f ( n As Integer) As Long
If n=1 Then
f=1
Else
f=n*f(n-1)
End if
函数调用:
Private Sub Form_Click()
Print "f(5)="; f(5)
End Sub
阅读课本p66页,对照自定义函数的规范。
进一步明确自定义函数的规范和函数调用的规范。
验证结果
教师:下发程序代码,学生自行调试,并完成以下小任务。
实践一:
尝试函数调用的三种方法。并验证结果。
实践二:
尝试多个数据,并和周围同学对照结果。
布置控件,设置不同的属性值,美化界面,以求最佳效果。
兵教兵课堂实践练习。
巩固本节课所学内容,同时练习以往所学属性设置。
教师演示程序界面
第二课时
经典案例
斐波那契
教师:关于递归算法应用的案例很多,在这里跟大家分享两个经典案例,一个是斐波那契数列,另一个是猴子吃桃;先看第一个斐波那契数列。
首先找学生叙述斐波那契数列?
斐波那契数列:
学生叙述斐波那契数列
用学生熟悉的案例激发学生学习的兴趣,递归法解决问题的案例在我们学习生活中无处不在。
代码参考
斐波那契应用
教学环节
教学活动预设
学生活动预设
设计意图
课件截图
经典案例
猴子吃桃
教师:接着我们看另一个经典案例,猴子吃桃。
问题描述:
小猴第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个,以后每天早上都吃前一天剩下的一半零一个,当到第十天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少个桃子?
教师:根据上一个问题,你能不能自行解决这个问题?
阅读问题,进行数学建模,并尝试编写代码。
强化对自定义函数的书写规范。
猴子吃桃程序界面
第三课时
教学环节
教学活动预设
学生活动预设
设计意图
课件截图
分层任务
递归求和
教师:下发上机任务。
实践任务一:
用递归算法求1到n连续自然数的和。分析数学建模?
补充完成代码。
Private fun_ction sum(n as integer)as integer
If then
Sum=1
Else
Sum=n+
End if
End fun_ction
3、验证结果并生成exe文件上交教师机。
写出数学建模,根据建模补充代码,验证后生成可执行文件上交。
根据不同学生的层次设计两个问题,让不同层次的学生都能充分感受到代码编写的强大魅力。
递归求和演示界面
教学环节
教学活动预设
学生活动预设
设计意图
课件截图
分层任务
最大公约数
实践任务二:
问题描述:求两个自然数的最大公约数?
教师:如何求两个自然数的最大公约数?请用自然语言描述?
自然语言描述
输入正整数m和n
X=m y=n
Temp=m除以n的余数
如果temp=0,输出n
否则m=n n=temp返回第二步
结束
参考代码
Function Maxgy(x as integer y as integer)
Dim temp as integer
Temp=x mod y
If temp=0 then
Maxgy=y
Else
Maxgy=maxgy(y,temp)
End if
End fun_ction
描述求两个自然数的最大公约数。
尝试代码的编写
总结
师生共同总结这三课时所学内容
知识方面
技能方面
有什么感悟
学生自己从不同的方面总结。
通过总结巩固所学
教学反思
用递归法解决问题分成三个课时进行授课的,主要考到其难度。其次考虑到学生的基础。根据学情,第一课时通过情景创设和游戏体验让学生了解递归概念,并通过具体问题考察标准函数无法解决该问题,从而引出自定义函数。学生顺理成章接受这些概念。第二课时,教师通过两个经典案例的分析、建模、编程、调试等步骤全面展示了递归法的使用过程,从中渗透着“自顶向下,逐步求精”的思想。明确了递归法使用的范围和条件。为下面学生独立解决问题做了必要的铺垫。第三课时,主要是上机体验过程。通过分层任务的设置,让不同层次的学生学有所乐,都能感受到递归法解决问题的优势所在,从而体验到编程解决问题的强大魅力。在上机体验过程,学生也体会到了互帮互助所带来的快乐,为学生之间和谐相处提高了帮助,培养了学生独立解决问题的能力和良好的学习习惯。遗憾之处在于授课课时有点多。