在一个 for 循环的循环体内部,再写一个 for 循环,就叫做嵌套循环。几个未知量,就套几层循环!
外层循环执行 1 次,内层循环就完整跑 1 遍。就像时钟:时针走1格,分针转一圈。
外层3次 × 内层4次 = 共执行 12次。三重循环就是 外×中×内,次数可以很多!
把所有可能的组合全部列出来,再用 if 筛选满足条件的答案。一个都不漏!
① 数未知量 → 几重循环
② 算最大值 → 写好 range()
③ 翻译条件 → 写 if 判断
走得慢,控制"行"
每走 1 步 → 等内层跑完一整圈
像时钟的 时针
跑得快,控制"列"
每次被外层唤醒就从头跑
像时钟的 分针
外层 i 取 0~4,内层 j 取 0~4,共 5×5=25 种组合。点击演示,观察执行顺序!
| 变量 | 含义 | 循环范围 |
|---|---|---|
| i 外层 | 🐔 鸡的数量 | range(50) → 0~49 |
| j 内层 | 🐰 兔的数量 | range(50) → 0~49 |
| 数学语言 | Python 代码 |
|---|---|
| 头数 = 50 | i + j == 50 |
| 腿数 = 160 | i*2 + j*4 == 160 |
| 两个都满足 | ... and ... |
外层变量 i 枚举鸡的数量,内层变量 j 枚举兔的数量。
鸡和兔的数量都不会超过50,所以两个循环都用 range(50),枚举 0 到 49。
鸡2条腿、兔4条腿。两个条件必须同时满足,用 and 连接写在一个 if 里。
| 变量 | 含义 | range 范围 | 原因 |
|---|---|---|---|
| i | 公鸡 | range(1,21) | 100÷5=20,最多20只,至少1只 |
| j | 母鸡 | range(1,34) | 100÷3≈33,最多33只,至少1只 |
| z | 小鸡 | range(3,100,3) | 至少3只,步长=3(倍数) |
| 数学语言 | Python 代码 |
|---|---|
| 总数量 = 100 | i + j + z == 100 |
| 总金额 = 100 | i*5 + j*3 + z//3 == 100 |
z÷3 元,Python 整除写 z//3。正因如此 z 必须是3的倍数,range 步长写3自动保证!
最外层枚举公鸡 i,中间层枚举母鸡 j,最内层枚举小鸡 z。
写 range(3, 100, 3),只枚举 3、6、9、12……z 一定是3的倍数,z//3 表示花的钱。
数量等于100 并且 金额也等于100,同时满足才打印答案。
| 问题 | 计算 / 答案 |
|---|---|
| 成人最多几人? | 40 // 8 = 5 人 |
| 儿童最多几人? | 40 // 3 = 13 人 |
| 两种人都要有? | range 从 1 开始! |
| 需要几重循环? | 2 重(两个未知量) |
range(1, 40//8+1)range(1, 40//3+1)i*8 + j*3 == 40+1?因为 range 不包含末尾值。写 range(1,6) 才能枚举到5!
| 变量 | 含义 | range 写法 |
|---|---|---|
| i 外层 | 🦅 九头鸟 | range(1,12) → 1~11 |
| j 中层 | 🐔 鸡 | range(100) → 0~99 |
| z 内层 | 🐰 兔 | range(100) → 0~99 |
| 数学关系 | Python 写法 |
|---|---|
| 头数 = 100 | i*9 + j + z == 100 |
| 脚数 = 100 | i*2 + j*2 + z*4 == 100 |
c = 0,每找到一组答案 c += 1,所有循环结束后再 print(c)!
最外层枚举九头鸟 i,中间层枚举鸡 j,最内层枚举兔 z。
先在最外层写 c = 0,每满足条件执行 c += 1,三重循环全部结束后再 print(c),这样 c 才是最终总数。
头数等于100 并且 脚数等于100,两个条件同时满足才打印并计数。
print(c) 写进循环里!每找到一个答案就打印一次,最终得到的不是总数。正确:c=0 和 print(c) 缩进都是 0,在最外面!
| 变量 | 含义 | range 写法 |
|---|---|---|
| i 外层 | 🐶 小狗数 | range(1, X//A+1) |
| j 内层 | 🐱 小猫数 | range(1, X//B+1) |
X//A 计算出最多能买几只狗,+1 保证能取到该值。
| 数学关系 | Python 写法 |
|---|---|
| 总花费 = X | i*A + j*B == X |
c = 0 计数,满足条件就 c += 1,最后 print(c)。
range(起点, 终点, 2),从 2 开始,步长 2 即可!range(2, 11, 2) → 2, 4, 6, 8, 10
| 变量 | range 写法 |
|---|---|
| i 大碗数 | range(2, a//b+1, 2) |
| j 小碗数 | range(2, a//c+1, 2) |
| 数学关系 | Python 写法 |
|---|---|
| 总花费 = a | i*b + j*c == a |
print(i, j) 即可。
for 里面套 for,缩进要整齐。几个未知量,就用几重循环。
总执行次数 = 外层 × 内层,就像时针和分针的关系。
① 数未知量 → 定循环层数
② 算最大值 → 定 range 范围
③ 翻译条件 → 写 if 判断
步长=2 → 只产生偶数
步长=3 → 只产生3的倍数
比 if 判断更简洁高效!
c = 0 写在所有循环外面
满足条件 c += 1print(c) 也在循环外面!
多个限制条件同时满足,用 and 连接。一个都不能少!
| 题目 | 循环层数 | 特殊技巧 | 输出内容 |
|---|---|---|---|
| 🐔🐰 鸡兔同笼 | 2 重 | 基础入门 | 每组答案 |
| 🐓 百钱百鸡 | 3 重 | range 步长=3(小鸡3倍数) | 每组答案 |
| 🎟️ 公园门票 | 2 重 | 从1开始(至少各一人) | 每组答案 |
| 🦅 九头鸟 | 3 重 | 计数变量 c | 每组答案 + 总数 |
| 🐶🐱 猫狗问题 | 2 重 | 动态 range(由输入决定) | 方案总数 |
| 🏮 阿凡提 | 2 重 | range 步长=2(只产生偶数) | 每组答案 |