第10课 函数与递归——自己调用自己 教学设计+html素材 小学信息科技Python程序设计

资源下载
  1. 二一教育资源

第10课 函数与递归——自己调用自己 教学设计+html素材 小学信息科技Python程序设计

资源简介

/ 让教学更有效 精品试卷 | 信息
小学四—五年级 Python 程序设计(第一学期)
教 学 设 计
第10课 函数与递归——自己调用自己
课  题 第10课 函数与递归——自己调用自己
课  时 第 10 课时(40 分钟)
课  型 新授 + 竞赛衔接
教学环境 机房(Windows + Python 3.x + IDLE/Thonny)
授课班级 四年级、五年级
一、学情分析
学生已经会定义函数、传参、return,能写出结构清晰的工具函数。本课要引入一个听起来神奇、其实很朴素的技巧:函数在内部调用自己,也就是递归。这是竞赛中阶乘、斐波那契、汉诺塔等经典题的通解。
学生的认知难点集中在两处:
1.觉得「自己调用自己」像是无限的、会出错的,心里发怵;
2.写不出「出口」(终止条件),导致递归无限进行而报错。
本课用「剥洋葱」「俄罗斯套娃」和「查字典」三个生活比喻,让学生理解递归的两个必备要素:出口 + 往小规模推进。
二、教学目标
(一)知识目标
1.理解递归的含义:函数在执行过程中调用自己。
2.掌握递归的两大要素——终止条件(出口)与递归调用(规模缩小)。
3.能用递归求解阶乘、斐波那契数列、数字各位之和等经典问题。
(二)能力目标
1.能根据问题写出递归函数,并正确设置终止条件。
2.能对简单递归画出「调用—返回」的过程图。
(三)素养目标
1.体会「把一个复杂问题化成同类的更小问题」这一数学化归思想。
2.培养耐心推演、逐步回溯的思维习惯。
三、教学重点与难点
项 目 内 容
教学重点 递归函数的写法;阶乘与斐波那契的递归实现;return 返回值的逐层回传。
教学难点 终止条件(出口)的设置;理解「先往里钻,再从最里面往外一层层回传」的过程;递归深度过大导致 RecursionError。
四、教学准备
· 教师:课件、俄罗斯套娃实物或图片、递归过程分解图。
· 学生:练习卷、上机账号。
· 素材:本课 5 个程序文件 1阶乘递归.py ~ 5递归求最大公约数.py。
五、教学过程(共 40 分钟)
环节一 情境导入:俄罗斯套娃(5 分钟)
出示俄罗斯套娃图片,提问:「想知道最里面那个最小的娃娃有多大,应该怎么做?」
学生答:「一层一层打开」——追问:「打开每一层的动作一样吗?」→ 完全一样,只是盒子越来越小。
引出:一个任务,如果「每一步都在做同样的事,只是问题越来越小」,就适合用递归。
再看「查字典」比喻:查一个词 A,解释里出现了不懂的词 B,于是再去查 B……如果一直查下去永远查不完;所以一定要有一个「已经认识、不用再查」的词,这个就是出口。
环节二 从循环到递归:阶乘的两种写法(12 分钟)
先复习上一课/以前做过的循环版阶乘,再对照写出递归版。
演示 1阶乘递归.py。
def fact(n):
if n == 1: # 出口:最里面那个娃娃
return 1
return n * fact(n - 1) # 递推:把问题缩小一圈
print(fact(5))
追问:「为什么 n == 1 时要 return 1 而不是继续调用?」→ 因为不能再往小推了,1 的阶乘是已知的、不用算的。这就是出口,没有出口递归就停不下来。
逐步展开 fact(5)(板书,画成一层层往里钻):
fact(5) = 5 * fact(4)
fact(4) = 4 * fact(3)
fact(3) = 3 * fact(2)
fact(2) = 2 * fact(1)
fact(1) = 1 ← 出口
然后一层层往回收:
fact(2) = 2 * 1 = 2
fact(3) = 3 * 2 = 6
fact(4) = 4 * 6 = 24
fact(5) = 5 * 24 = 120
强调两个阶段:先去「递」(往下钻到底),再「归」(从底往上回传)。函数是「先钻到底,才开始算回来的」。
对照表,让学生看到两种写法思路不同、结果相同:
写 法 核 心 适合场景
循环 从 1 乘到 n,一路累乘 次数明确、过程像流水线
递归 n! = n × (n-1)!,问题自我缩小 问题本身有「自己包含自己」的结构
环节三 新授:斐波那契数列(10 分钟)
出示数列 1, 1, 2, 3, 5, 8, 13, 21……提问:「每一项和它前面两项有什么关系?」
学生发现:从第三项起,每一项 = 前两项之和。
演示 2斐波那契递归.py。
def fib(n):
if n == 1 or n == 2: # 出口有两个
return 1
return fib(n - 1) + fib(n - 2)
for i in range(1, 11):
print(fib(i), end=" ")
区别在于:阶乘只有一条递归线,斐波那契分成两条(左一支、右一支),像树的枝杈。可以在黑板上画出 fib(5) 的展开树。
fib(5)
┌───────┴───────┐
fib(4) fib(3)
┌───┴───┐ ┌───┴───┐
fib(3) fib(2) fib(2) fib(1)
┌──┴──┐
fib(2) fib(1)
指出:树里 fib(3)、fib(2) 被重复计算了好几次,n 一大就算得特别慢——这为下一课的枚举与优化埋下伏笔。
环节四 新授:递归求和、各位数字之和(8 分钟)
演示 3递归求和.py,用递归求 1+2+…+n。
def total(n):
if n == 1:
return 1
return n + total(n - 1)
print(total(10))
让学生发现它和阶乘只差一个运算符:一个是乘,一个是加,骨架完全一样。这就是「同一个递归模型换个运算」。
演示 4递归求各位数字之和.py。
def digit_sum(n):
if n < 10:
return n
return n % 10 + digit_sum(n // 10)
print(digit_sum(12345))
讲解:「取出个位用 % 10,剩下的数用 // 10」,这正是第 1 课学过的整除与取余,在递归里又派上了用场。每剥掉一位,数就变小一圈,直到只剩一位为止。
提醒一个常见错误:忘记写出口,程序会报 RecursionError(递归深度超出)。可以现场演示一次,让学生看到报错信息。
环节五 综合应用与总结(5 分钟)
演示 5递归求最大公约数.py(辗转相除法),做进阶展示,不强求全员掌握。
def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)
print(gcd(48, 36))
指出:欧几里得在两千多年前就用递归思想解决这个问题,今天你写出的代码和古人的思路是一致的。
本课一句话总结:递归就是「自己做和刚才一样的事,但问题小一圈」;写递归先写出口(什么时候不用再往下走),再写怎么把问题缩小;函数会一路钻到底,再一层层把结果传回来。
六、板书设计
第10课 函数与递归
递归 = 出口 + 自我调用(规模缩小)
def fact(n):
if n == 1: ← 出口,必须先写
return 1
return n * fact(n-1) ← 递推
fact(3) = 3 * fact(2)
= 3 * 2 * fact(1)
= 3 * 2 * 1 ← 从里往外回传
没有出口 → RecursionError
斐波那契:fib(n) = fib(n-1) + fib(n-2)
七、分层作业
★ 完成练习卷第一、二、三题(填空、判断、手算模拟)。
★★ 完成练习卷第四题:用递归求 1+2+…+n;用递归求一个整数各位数字之和。
★★★ 完成练习卷第五题:用递归求第 n 项斐波那契数,并思考:为什么算 fib(35) 会很慢?把你观察到的现象写下来。
八、教学反思要点
1.「先钻到底再回传」的过程学生是否真的理解?画展开图是否比口头讲解更有效?
2.有没有学生忘记写出口?下一次是否要在环节二就强调「先写出口」的顺序?
3.斐波那契的展开树是否让学生直观感到重复计算?可保留此伏笔衔接下一课优化。
4.递归对小学生偏抽象,是否需要在课后再补一次「递归三问」小测?
课后记(教师填写):
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
21世纪教育网 www.21cnjy.com 精品试卷·第 2 页 (共 2 页)
21世纪教育网(www.21cnjy.com)

展开更多......

收起↑

资源预览