椰程信奥 · 说课稿

递归 · 说课稿(对应视频 23′27″)

一、教材与学情

本讲对应视频《CSP复赛专题12-递归》(23′27″)。讲解递归的概念("递"与"归"两阶段、调用栈实现、 递归三要素),并通过放苹果、小球摆放、上台阶、十进制转二进制四道题建立写递归的手感, 最后引出记忆化与递归改递推。

学情上的典型困难:① 把递归理解成"函数调自己",只会抄模板,不理解"栈"这一层; ② 写不出终止条件或终止条件不完备(如放苹果漏掉 n > m)→ 无限递归 RE; ③ 不知道递归会重复计算,更不知道深度大了会爆栈。

二、教学目标

三、重点难点

重点

① 递归三要素与栈帧模型;② 放苹果的"互斥且穷尽"分类; ③ 记忆化的三行改动。

难点

① "归"的顺序(为什么能天然倒序输出); ② 记忆化能降复杂度但降不了栈深度;③ 递归 → 递推的改写时机。

四、教学过程(45 分钟)

环节时间教师活动学生活动设计意图
① 递与归8′第 3 页动画:点「递一层」让学生猜下一层参数是多少, 到底后点「归一层」让学生先报这一层的返回值再揭示 口头报参数与返回值把栈变成可推演的模型
② 栈帧与三要素6′第 4 页:连点"再调一层"直到报出栈溢出, 讲清三要素缺一个会怎样观察深度数字,说出溢出原因建立深度 = 栈高 的直觉
③ 尾递归4′第 5 页对比两段代码,追问"哪一层回来还要做事" 指出普通递归每层未完成的加法理解"尾"的含义
④ 例题1 放苹果9′第 6–7 页:递归树动画 + 代码, 重点停在 n > m 这条,让学生说删掉会怎样 说明会 m−n 变负 → 无限递归把最高频失分点讲透
⑤ 重复计算6′第 8 页:切换 f(6)/f(8),点「统计重复」, 让学生读"百分之多少是白做的"读出重复比例自己发现要优化
⑥ 记忆化6′第 9 页动画:看 memo 表被一格格填满, 同时追问"深度降了吗"回答:复杂度降了,深度没降区分两个不同维度
⑦ 进制转换4′第 10 页:调换 cout 位置看输出反转 预测输出顺序"归"的顺序决定输出
⑧ 检测2′第 14 页三道检测完成检测形成性评价

五、板书设计

递归三要素:① 终止条件 ② 递归调用(规模必须变小) ③ 返回结果
调用栈:每调一次压一帧,每 return 弹一帧 深度 = 递归层数 上限几千层
放苹果:f(m,n) = f(m,n-1)【有空盘】 + f(m-n,n)【无空盘】 边界 m==0||n==1 → 1;n>m → f(m,m)
记忆化:if(memo[i]!=-1) return memo[i]; return memo[i] = ... (用 -1 初始化,别用 0)
判据:递归树是一条链 → 改循环;分叉 → 保留递归 + 记忆化;深度上千 → 必须改递推

六、教学亮点与反思

七、答辩预设

问:讲了记忆化,为什么标程还用递推?
答:因为本题 N 到 10⁵,记忆化解决的是重复计算,解决不了 10 万层的栈深度。 这正是要让学生建立的分层认识:复杂度是一回事,空间(栈)是另一回事。