【果果编程课】008 递归魔法 —— 俄罗斯套娃的无限力量!自己召唤自己的超级魔法

(45分钟魔法课 · 适合6-12岁小朋友)

课程目标(今天彻底玩懂这个超级魔法)

  • 看懂递归:一个函数可以自己召唤自己,像俄罗斯套娃一层套一层!
  • 牢牢记住两大铁律:停止条件 + 自己召唤更小的问题
  • 亲眼看到递归怎么一步步“展开”又“收回来”
  • 用身体真实感受“调用”和“返回”的过程(动觉学习者狂喜!)
  • 学会3个最简单最可爱的递归函数
  • 自己动手做4个小练习

核心口诀(全班一起喊3遍!):
“Big problem = smaller same problem + call myself again!
First say STOP! or it will spin forever~”


第一部分:问题引入(5分钟)—— 果果收到无限糖果套娃盒!

故事时间:
果果的魔法糖果店今天收到一个大礼盒!打开一看,里面有一个一模一样的更小糖果盒,再打开还有更小……一直到最小的一颗小糖果!

果果问:“这个盒子一共有多少层啊?怎么才能知道呢?”

这就是递归的魔法——不用一个一个数,而是让“自己”去打开更小的盒子,直到打开最小的那一个!

(老师可以让小朋友拿纸画一排套娃,或者用手机搜“Russian nesting doll”看视频)


第二部分:递归两大铁律(讲透!10分钟)—— 像剥洋葱一样

铁律1:停止条件(Base Case)
“到了最小的问题,就直接回答,不再召唤自己!”
→ 就像套娃里最小的那个娃娃,打开就到底了,不用再打开。

铁律2:递归调用(Recursive Call)
“把大问题变成一个小一点的同样问题 + 自己再召唤一次!”
→ 大盒子的问题 = 打开它 + 让更小的盒子自己解决

可视化:展开 vs 收回来
想象果果在剥洋葱:
一层一层剥下去(展开)→ 剥到最中心(停止)→ 再一层一层包回去(收回来)


第三部分:可视化一步步展开(重头戏!12分钟)—— 3个超级简单例子

我们用超级慢动作一步一步看清楚!(函数全部用英文命名)

例子1:countdown-candies(倒数吃糖果)

1
2
3
4
5
6
7
8
(define (countdown-candies n)
(if (= n 0) ; 停止条件
(printf "Stop! Eat candy! 🍭\n")
(begin
(printf "Candy ~a !\n" n)
(countdown-candies (- n 1))))) ; 自己召唤自己

(countdown-candies 3)

一步步可视化展开(老师边说边在黑板画树):

1
2
3
4
5
6
7
8
9
10
11
countdown-candies(3)
Print "Candy 3 !"
↓ call countdown-candies(2)
Print "Candy 2 !"
↓ call countdown-candies(1)
Print "Candy 1 !"
↓ call countdown-candies(0)
→ Stop! Eat candy! 🍭 ← BASE CASE!
↑ return
↑ return
↑ return

例子2:sum-candies(糖果总颗数)

1
2
3
4
5
6
7
(define (sum-candies lst)
(if (empty? lst) ; 停止条件:盒子空了
0
(+ (first lst) ; 拿第一颗
(sum-candies (rest lst))))) ; 自己算剩下的

(sum-candies (list 5 3 2)) ; → 10

可视化树形展开:

1
2
3
4
sum-candies([5,3,2]) = 5 + sum-candies([3,2])
= 5 + (3 + sum-candies([2]))
= 5 + (3 + (2 + sum-candies([])))
= 5 + (3 + (2 + 0)) = 10

例子3:candy-factorial(糖果打包组合数)

1
2
3
4
5
6
(define (candy-factorial n)
(if (= n 0) ; 停止条件
1
(* n (candy-factorial (- n 1)))))

(candy-factorial 4) ; → 24

一步步展开:

1
2
3
4
candy-factorial(4) = 4 × candy-factorial(3)
= 4 × (3 × candy-factorial(2))
= 4 × (3 × (2 × candy-factorial(1)))
= 4 × (3 × (2 × (1 × 1))) = 24
果果编程第8课


超级动觉游戏时间!(3分钟)—— 站起来玩人体俄罗斯套娃!

(放在第三部分结束后,全班站起来,动觉学习者最爱!)

老师说:“现在我们用身体来感受递归!大家站起来排成一排(3-5人一组)!”

游戏玩法(老师带头示范): - 老师是大娃娃(第1层),大声喊:“I want to know total number of people!” - 老师拍拍同学A肩膀:“You are my smaller me! You calculate how many left!” - 同学A拍拍同学B:“You are my smaller me! You calculate how many left!” - …… 一直拍到最后一个同学(最小娃娃)大喊:“Stop! Only me 1 person!”(停止条件) - 然后层层返回: - 最后一个同学告诉前面的人:“I have 1!” - 前一个人加上自己再告诉上一个人:“I have 2!” - …… 最后老师宣布:“Total 3 people!”

全班玩2-3组,边玩边喊“call down!” “return up!”
孩子们笑成一团,但瞬间就懂了“调用下去”和“返回上来”的真实感觉!


第四部分:简单练习(10分钟 + 回家作业)

课堂马上试试(老师带做): 1. 改 countdown-candies 从5数到1,打印“Eat the Xth candy!” 2. 写 candy-sum n 求 1+2+…+n (提示:(+ n (candy-sum (- n 1)))) 3. 写 candy-length lst 返回列表里有几颗糖果(空列表返回0) 4. 想一想生活中哪里还有“自己召唤自己”:折纸、讲故事“从前有座山……”、剥橘子…

回家作业(截图发爸爸妈妈或果果老师): 1. 运行 candy-factorial 5,手写展开过程(像上面那样画箭头) 2. 用 candy-sum 6 算出结果,并告诉家人这是什么意思 3. 把人体游戏拍个小视频,发给果果老师看~


下节课预告
第009课:魔法升级!把递归 + map + filter 合成超级糖果店管理系统

老师寄语
哇!今天果果不但用眼睛看懂了,还用身体玩懂了自己召唤自己的无限魔法
递归就像果果长大:每解决一个小问题,就离大梦想更近一步~

把今天的英文函数代码粘到DrRacket跑一跑,手写展开过程,玩人体游戏拍视频,发给我们看!
下课啦!记得多吃糖果(适量哦)🍭✨

(本课100%聚焦基础原理、全程可视化+身体游戏、函数全英文命名、完美45分钟节奏,直接复制上课即可~)