← 首页
00:00点开始
学情 用时 0′ 尝试 0 出错 0 归因 0
D 数据期 · 第三课
打擂台:一个个比,谁赢留谁

求和是把所有数加起来。可要是想知道哪个最大、哪个最小呢?
办法叫打擂台:先让第一个上台,后面每个都来挑战,赢的留下。

开场 9 分钟怎么花: 回扣课28"累加器"(3′)→ 抛"那谁最大呢"(3′)→ 发手帖 + 预告作品《谁最大谁最小》(3′)。
老师说 擂台规矩两条:① 擂主一开始就是列表第一个; ② 后面每个都来比一次,赢了才换人。
所以擂台变量也是只在循环外初始化一次。
第二十九种陷阱:擂主初值设成 0。 找最小的时候写 small = 0,结果永远是 0—— 因为 0 比所有正数都小,没有谁能打赢它,数据里根本没这个 0。

第一步 · 打不赢的擂主 09′–23′ · 14 分钟 · 最小值怎么是 0

陷阱换了(第二十九种)
擂主初值设错,永远没人能赢
老师说 data 里最小的数是 30。先猜:这段算出来的 small 是几?猜完运行。
看最后那条短线的长度——它就是 small。

盯着 small = 0:0 比 45、82、67、91、30 都小。
所以 v < small 一次都不成立,擂主从头到尾没换过——还是 0。

老师纪律:别说"初值该用第一个"。只问: 「0 在 data 里吗?如果不在,它凭什么当最小值?」

第二步 · 擂台规矩 23′–37′ · 14 分钟 · 初值取第一个

老师说 两条规矩:① 擂主初值取 data[0](数据里真实存在的一个); ② 找最大用 >,找最小用 <,别写反。
找最大和找最小是同一套代码,只换一个符号。
这一轮的 v
45
目前最大
45
目前最小
45
为什么坚持手推:擂台是"每轮可能换人"的过程。 两列当前最大/最小写出来,学生能看到它什么时候换、什么时候没换。
休息 1
37′–47′ · 10 分钟 · 站起来动一动
老师说 留个问题:如果 data 里所有数都是负数,擂主还能用 0 吗?
回来验证。

第三步 · 人肉电脑 47′–65′ · 18 分钟 · 不许按运行

老师说 关掉运行。标准骨架里两个擂台同时打。
在纸上写:这一轮 v 是几?比完最大变成几?最小变成几?
标准骨架:big = data[0]; small = data[0], 循环里 if v > big: big = v 和 if v < small: small = v。
人肉电脑的落点:学生要能说出「第 2 轮 82 打赢了 45, big 换成 82;但 small 没动」——说不出"谁换谁不换"就是没跟上擂台。

第四步 · 自己搭 65′–85′ · 20 分钟 · 找出你自己的最大最小

老师说 写一串数,同时找出最大和最小,再用两条线画出来。要求三条:
① 两个擂主初值都取 data[0] ② 两个 if 各更新一个 ③ 结果都画出来
巡场只问三句:两个擂主初值是几?两个 if 各管哪个?结果画出来了吗?
休息 2
85′–91′ · 6 分钟 · 伸个懒腰
老师说 回来改一个数:把 90 改成 19,看最大和最小分别变成几。

第五步 · 改数试试 91′–105′ · 14 分钟 · 换个数,擂主换人

老师说 只改一个数:90 改成 19。
先猜:最大变成几?最小变成几?再运行。
这一步的收获:只改一个数, 最大从 90 掉到 70、最小从 20 掉到 19——擂台代码一个字没改。

第六步 · 读码迁移 105′–120′ · 15 分钟 · 它找的是最大还是最小

老师说 最后 15 分钟不写新代码——读。这段看起来像找最小,其实有坑。
说出它最终打印几,以及为什么。
读码四步:① 擂主初值是谁 → ② 比较方向 → ③ 每轮谁换谁不换 → ④ 最后是几。
  • 填手帖:本课三问——擂主初值是几 / 比较符号是哪个 / 每轮谁换
  • 家庭挑战:把《谁最大谁最小》讲给爸妈听,说清初值为什么不能是 0
收尾话术(家长版): 「他今天学的是找极值——成绩排名、最高分、最低价都是这个套路。 您可以问他:数据全是负数时,擂主还能设 0 吗?他说得清,就是真懂。」

海龟的画布

(摆好卡片,按运行)

对应的 Python 代码 实时同步

本课硬事实 老师自查