在网上搜索梵塔游戏fanta.exe,自己动手,体会梵塔问题,尝试解决问题。
3
问题分析
教师提出问题:
1. 盘子移动过程中的两个要求?
2. 寻找规律:(教师引导,学生描述移动过程)
(1)两个盘子怎么移动?
(2)N 个盘子怎么移动?(可将上面的n-1个盘子“捆”在一起当作一个小盘)
(3)通过(2)步操作,将n个盘子的移动简化为n-1个盘子的移动,这样如此下去,每次减少一个盘子,直到只剩一个盘子为止。
学生回答:
1.(1)每次只能移动一个盘
(2)一个柱子上不能大盘放到下盘下。
2.(1)move(2,a,b,c)分三步:
1号盘从a移至b move 1:a→b
2号盘从a移至c move 1:a→c
1号盘从b移至c move 1:b→c
(2)可以描述为:
move(n-1,a,c,b)
n : a→c
move(n-1,b,a,c)
10
算法描述
师生共同完成算法描述:(难度较大)
递归的边界是无盘可移,即n=0。其移动过程的算法可描述如下:
Move(n,a,b,c)
① if n=0 推出程序
② 调用move(n-1,a,c,b)
③ 输出“盘号 柱号→柱号”
④ 调用 move(n-1,b,a,c)
7
编程实现
师生共同完成程序编写:
上述描述写成Java代码:
//利用递归定义move()方法
Static void move(int n,Sring a,String b,String c)
{
If(n!=0)
{
Move(n-1,a,c,b); //将n-1个盘从a经c移至b
System.out.println(n+”: ”+a+” →”+c); //输出移动过程:将n号盘从a移至c
K=k+1;
Move(n-1,b,a,c);
}
}
完整程序,参照课本132页。
8
教师总结
使用递归算法可以方便的解决很多实际问题,当遇到复杂问题时,我们可以通过判断问题是否能分解为若干相同性质的小问题和是否有明确的结束条件来判断是否适合用递归法来解决问题。
熟练掌握递归法解决问题的关键,在于能否准确从问题中提炼出递归函数关系式和找到递归出口。
通过本节课的学习,我们要学会把复杂的问题简单、抽象,建构合理的递归函数解决我们日常生活的实际问题。
5
八、关键环节提炼
1.问题分析(年龄问题)
通过师生互动,明确递归调用必须要有递归结束条件(递归出口),通过学生自己总结递归函数关系式,提高学生分析问题,解决问题能力,进而掌握适合递归方法解决问题的两个条件,实现教学重点的突破。
2.温故知新(斐波纳契函数/兔子繁殖问题)
不满一个月的为小兔子,满一个月不满两个月的为中兔子,满3个月以上的为老兔子
第几个月
小兔子对数
中兔子对数
老兔子对数
兔子总数
1
1
0
0
1
2
0
1
0
1
3
1
0
1
2
4
1
1
1
3
5
2
1
2
5
6
3
2
3
8
7
5
3
5
13
…
…
…
…
…
通过问题分析,归纳递归函数表达式,进一步培养和提升学生的分析、归纳、总结、解决问题的能力,使学生掌握正确的应用递归法分析、解决实际问题的能力,实现教学难点的突破。
Public class Fibonacci
{
Static int fib(int n)
{ if (n<=2)
① ;
Else
② ;
}
Public static void main(String args[])
{ System.out.println(“fib(20)=”+fib(20);)
}
}
限于我校学生编程水平有限,所以通过填写程序来温习上节课学习重点,即递归出口和递归关系表达式。
九、教学反思
本节内容通过探讨一些生活中的具体问题解决方法(年龄问题、兔子繁殖问题),使学生比较轻松的接受了递归算法的概念,进一步理解了递归算法的使用条件,知道递归算法的设计步骤;能够对提出的问题进行分析判断,是否适合使用递归法来解决,并能从中归纳总结出递归函数关系式、找到递归出口。本节课通过教师讲授、师生互动、学生分组讨论,充分调动了学生主动探索学习的积极性,能主动地与他人进行合作、交流,形成了一种和谐、积极参与的教学气氛。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-25299-2.html