【果果编程课】 第010课(拆分版):闭包魔法——盒子里的秘密(基础篇)
果果编程课 第010课(拆分版):闭包魔法——盒子里的秘密(基础篇)
拆分说明
原第010课内容较丰富,我已拆分成两节课(可根据需要扩展): - 第010课(基础篇):专注闭包概念。循序渐进,从故事到代码示例,确保小白(6-12岁孩子)明白。强调比喻(如“魔法盒子”),互动游戏,避免数学复杂。只用简单计数器示例,与Racket真实闭包(let + lambda)匹配(书籍第3章)。 - 第011课(应用篇):应用闭包解决数学问题(平均、折扣、面积)。延续故事,实践四年级数学。预告在总结中。
这样确保第一课“讲透彻闭包”,不分散注意力。后续课渐进式加深。
课程概述(基础篇)
- 目标年龄:6-12岁(四年级水平)。
- 时长:45分钟。
- 编程语言:Racket(DrRacket IDE)。
- 主题:"魔法糖果店"——果果发现“闭包盒子”,能锁住秘密数字,帮助记住东西。
- 数学轻触:只涉及简单加法(计数),不深入。四年级:理解“记住值”像累加游戏。
- 预备知识:前009课(变量、Lambda、For)。书籍第3章闭包基础。
- 学习目标:
- 明白闭包:像“带锁盒子”,锁住变量(秘密),外面函数反复用。
- 会写简单闭包代码。
- 趣味:通过游戏和故事,让孩子觉得闭包是“魔法”。
课程结构(45分钟)
1. 开场故事(10分钟)
- 内容:果果的糖果店有秘密配方(如加糖次数),但每次计算都忘上次结果。果果找到“闭包魔法盒子”:里面锁秘密数字(变量),外面钥匙(函数)能打开加东西,但秘密不丢!
- 故事:果果数糖果:第一次1个,第二次+2=3,第三次+3=6。但不用闭包,每次从0开始(错!)。用闭包,盒子记住上次总和,像“聪明日记本”。
- 互动游戏(让孩子明白“记住”):
- 道具:纸盒子(闭包)、纸条(秘密数字,如“总糖果=0”)。
- 玩法:孩子轮流“加糖果”——说数字(1、2、3),放进盒子(更新秘密纸条,如0+1=1),锁上。下一个孩子打开,加新数(记住上次)。
- 问题:不用盒子,为什么会忘?用盒子,为什么聪明?(答案:闭包锁住“记忆”!)
- 过渡:现在用Racket代码做“魔法盒子”!
2. 核心讲解:闭包是什么?怎么用?(15分钟)
- 步骤1:闭包像什么?(比喻,小白易懂)
- 闭包 = “带锁的魔法盒子”:
- 盒子里面:秘密变量(let锁住,像count=0)。
- 外面钥匙:函数(lambda),能打开盒子改秘密,但秘密不跑掉。
- 为什么魔法?正常变量用完就忘;闭包记住上次值,下次继续用。
- 可视化:画图——盒子(let [count 0]),箭头钥匙(lambda () (set! count (+ count 1)))。
- 真实匹配:书籍第3章闭包是“捕捉外部变量的函数”,这里用let+lambda实现。
- 闭包 = “带锁的魔法盒子”:
- 步骤2:简单代码示例(一步步建,孩子跟敲)
- 最简单:固定秘密盒子
- 代码:
1
2
3
4
5
6
7
8
9
10#lang racket ; 第一行,告诉电脑用Racket
(define (make-box secret) ; 创建盒子函数
(let ([hidden secret]) ; 锁住秘密(变量hidden)
(lambda () ; 钥匙函数
hidden))) ; 返回秘密
(define my-box (make-box "糖果密码")) ; 召唤盒子,锁"糖果密码"
(my-box) ; 输出: "糖果密码"(打开盒子,看秘密)
(my-box) ; 又输出: "糖果密码"(记住,不变!) - 解释:
let:锁盒子,藏hidden。lambda:钥匙,每次打开都看到一样秘密(不变)。- 运行:孩子敲代码,看输出。问:“为什么第二次还记得?”(闭包魔法!)
- 互动:改秘密为数字1,运行两次。问:“正常变量会忘吗?”(演示无闭包变量,证明会忘)。
- 代码:
- 进阶:会变的秘密盒子(计数器)
- 代码(书籍第3章闭包计数器示例):
1
2
3
4
5
6
7
8
9
10(define (make-counter) ; 创建计数盒子
(let ([count 0]) ; 锁住秘密count=0
(lambda () ; 钥匙
(set! count (add1 count)) ; 改秘密:加1
count))) ; 返回新秘密
(define fruit-counter (make-counter)) ; 召唤盒子
(fruit-counter) ; 输出: 1(第一次加1)
(fruit-counter) ; 输出: 2(记住上次,加1)
(fruit-counter) ; 输出: 3(继续加!) - 解释(小白版):
- 盒子锁
count=0。 - 钥匙每次打开:看秘密、加1、再锁回去。
- 为什么记住?闭包让
count不丢,像“聪明计数器”。
- 盒子锁
- 匹配真实实现:Racket闭包用let捕获变量,lambda访问/修改(set!)。书籍强调“捕获外部变量”。
- 互动:孩子运行,数“果果糖果个数”。问:“如果不用闭包,怎么办?”(演示全局变量,解释不安全)。
- 代码(书籍第3章闭包计数器示例):
- 最简单:固定秘密盒子
- 步骤3:为什么用闭包?(让孩子明白)
- 好处:安全(秘密不漏)、方便(记住状态,像游戏分数计数器)。
- 比正常函数:正常函数用完忘;闭包像有记忆的机器人。
- 游戏:孩子分组,模拟代码——一人当“盒子”(藏纸条数字),别人当“钥匙”(加1,读纸条)。演示“忘秘密” vs. “记住”。
3. 动手练习:自己做闭包盒子(15分钟)
- 练习1:简单秘密盒子
- 任务:做“果果生日盒子”,锁生日日期("2026-03-11"),钥匙返回日期。
- 代码模板:提供半成品,孩子填空(let、lambda)。
- 运行:改秘密为今天日期(2026-03-11),输出看是否记住。
- 任务:做“果果生日盒子”,锁生日日期("2026-03-11"),钥匙返回日期。
- 练习2:计数器升级
- 任务:果果数顾客,用闭包计数器。加For循环(前课):数5个顾客。
1
2
3(define my-counter (make-counter)) ; 从讲解复制
(for ([i 5]) ; For循环(课008)
(displayln (my-counter))) ; 输出1到5 - 扩展:加参数——(lambda (add-num) (set! count (+ count add-num)))。孩子试加2、3等。
- 任务:果果数顾客,用闭包计数器。加For循环(前课):数5个顾客。
- 小组活动:分小组,设计“糖果分数盒子”(赢糖果加分)。分享代码,谁的盒子“最聪明”?
4. 总结与预告(5分钟)
- 总结:闭包是“魔法盒子”——用let锁变量,lambda当钥匙。记住秘密,不忘!今天我们做了计数器,下节用它算数学题。
- 作业:1. 改代码做“年龄盒子”(每年加1)。2. 画“闭包盒子”漫画。3. 想:闭包像生活什么?(如日记锁)。
- 预告:第011课——闭包帮果果算钱!用闭包求平均价、打折、面积(四年级数学)。
教学资源
- 代码文件:.rkt模板,孩子填空。
- 可视化:画盒子图、用玩具盒演示。
- 评估:孩子解释“闭包为什么记住?”运行代码无错。
- 安全:代码简单,无复杂数学,确保孩子不挫败。
这节课专注闭包基础,故事+示例+互动,让小白孩子透彻明白!后续课应用数学,渐进式。