Appearance
12. 嵌套循环:二维世界的降临
前置学习:for 循环
我们之前写的循环,都是在一条直线上跑圈,处理的是“一维”的问题。但在真实的编程世界中,我们经常要处理“平面”的问题(比如棋盘、地图、矩阵)。 这时候,我们就需要把一个循环,塞进另一个循环的肚子里,这就是嵌套循环 (Nested Loop)。
1. 钟表齿轮效应
理解嵌套循环,最好的比喻就是时钟的指针。
- 外层循环:就像是分针。
- 内层循环:就像是秒针。 分针(外层)每走 1 格,秒针(内层)就要狂奔 60 圈!
cpp
// 外层循环:控制行数 (走 3 次)
for (int i = 1; i <= 3; i++) {
// 内层循环:控制每一行输出几个星号 (走 5 次)
for (int j = 1; j <= 5; j++) {
cout << "*";
}
// 内层 5 个星号打印完后,外层负责换行
cout << endl;
}运行结果(一个 3 行 5 列的矩形):
text
*****
*****
*****💡 运行规律:外层循环执行 1 次,内层循环必须完整地执行完所有圈数。 这个程序总共打印了 $3 \times 5 = 15$ 个星号。
2. 💀 新手的两大灾难
灾难一:变量名冲突 在写嵌套循环时,内层的计数器绝对不能和外层用一样的名字!
cpp
// 错误示范:会导致死循环或逻辑彻底崩盘!
for (int i = 1; i <= 3; i++) {
for (int i = 1; i <= 5; i++) { ... }
}OIer 铁律:外层循环用 i,内层循环用 j。如果有第三层,就用 k。
灾难二:超时 (TLE) 如果外层循环 $N$ 次,内层也循环 $N$ 次,那么总共要执行 $N \times N$ 次(也就是 $N^2$ 次)。 如果题目给的 $N$ 是 10000,那么你的程序要执行 1 亿次!在 C++ 中,超过 1 亿次的循环极其容易超出题目的时间限制。在未来的算法学习中,如何避免写出“两层嵌套”,是我们要攻克的核心难题。
3. 进阶实战:打印直角三角形
刚才矩形的内层循环次数是固定的(每次都是 5)。如果让内层的循环次数,跟着外层的变量 i 发生变化,就能画出有趣的图形。
cpp
int n = 5; // 总共打印 5 行
for (int i = 1; i <= n; i++) {
// 关键改动:内层每次只打印 i 个星号
for (int j = 1; j <= i; j++) {
cout << "*";
}
cout << endl;
}运行结果:
text
*
**
***
****
*****第一行 i=1 时,内层只走 1 次;第二行 i=2 时,内层走 2 次... 以此类推。
4. 动手实践
md
1. 打开左下角的代码沙盒。
2. 终极挑战:请利用嵌套循环,在屏幕上打印出小学的**九九乘法表**。
*(提示:外层循环 `i` 从 1 到 9;内层循环 `j` 从 1 到 `i`;输出格式类似 `cout << j << "*" << i << "=" << j * i << " ";`)*