【果果编程课】 第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. 最简单:固定秘密盒子
      • 代码:
        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,运行两次。问:“正常变量会忘吗?”(演示无闭包变量,证明会忘)。
    2. 进阶:会变的秘密盒子(计数器)
      • 代码(书籍第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:为什么用闭包?(让孩子明白)
    • 好处:安全(秘密不漏)、方便(记住状态,像游戏分数计数器)。
    • 比正常函数:正常函数用完忘;闭包像有记忆的机器人。
    • 游戏:孩子分组,模拟代码——一人当“盒子”(藏纸条数字),别人当“钥匙”(加1,读纸条)。演示“忘秘密” vs. “记住”。
3. 动手练习:自己做闭包盒子(15分钟)
  • 练习1:简单秘密盒子
    • 任务:做“果果生日盒子”,锁生日日期("2026-03-11"),钥匙返回日期。
    • 代码模板:提供半成品,孩子填空(let、lambda)。
    • 运行:改秘密为今天日期(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等。
  • 小组活动:分小组,设计“糖果分数盒子”(赢糖果加分)。分享代码,谁的盒子“最聪明”?
4. 总结与预告(5分钟)
  • 总结:闭包是“魔法盒子”——用let锁变量,lambda当钥匙。记住秘密,不忘!今天我们做了计数器,下节用它算数学题。
  • 作业:1. 改代码做“年龄盒子”(每年加1)。2. 画“闭包盒子”漫画。3. 想:闭包像生活什么?(如日记锁)。
  • 预告:第011课——闭包帮果果算钱!用闭包求平均价、打折、面积(四年级数学)。

教学资源

  • 代码文件:.rkt模板,孩子填空。
  • 可视化:画盒子图、用玩具盒演示。
  • 评估:孩子解释“闭包为什么记住?”运行代码无错。
  • 安全:代码简单,无复杂数学,确保孩子不挫败。

这节课专注闭包基础,故事+示例+互动,让小白孩子透彻明白!后续课应用数学,渐进式。