本讲对应视频《CSP复赛专题12-递归》(23′27″)。讲解递归的概念("递"与"归"两阶段、调用栈实现、 递归三要素),并通过放苹果、小球摆放、上台阶、十进制转二进制四道题建立写递归的手感, 最后引出记忆化与递归改递推。
学情上的典型困难:① 把递归理解成"函数调自己",只会抄模板,不理解"栈"这一层;
② 写不出终止条件或终止条件不完备(如放苹果漏掉 n > m)→ 无限递归 RE;
③ 不知道递归会重复计算,更不知道深度大了会爆栈。
① 递归三要素与栈帧模型;② 放苹果的"互斥且穷尽"分类; ③ 记忆化的三行改动。
① "归"的顺序(为什么能天然倒序输出); ② 记忆化能降复杂度但降不了栈深度;③ 递归 → 递推的改写时机。
| 环节 | 时间 | 教师活动 | 学生活动 | 设计意图 |
|---|---|---|---|---|
| ① 递与归 | 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 页三道检测 | 完成检测 | 形成性评价 |
问:讲了记忆化,为什么标程还用递推?
答:因为本题 N 到 10⁵,记忆化解决的是重复计算,解决不了 10 万层的栈深度。
这正是要让学生建立的分层认识:复杂度是一回事,空间(栈)是另一回事。